2011-09-02 85 views
9

我有一个ArrayList<Car>查找重复值的ArrayList

对于实例

class Car{ 
    String carName; 
    int carType; 
} 

现在,我已经找到,如果列表中具有相同名称的任何汽车。做这个的最好方式是什么?

回答

22

创建一个比较:

public class CarComparator implements Comparator<Car> 
{ 
    public int compare(Car c1, Car c2) 
    { 
     return c1.carName.compareTo(c2.carName); 
    } 
} 

现在ArrayList的所有的汽车添加到SortedSet,最好TreeSet;如果有重复添加到副本列表:

List<Car> duplicates = new ArrayList<Car>(); 
Set<Car> carSet = new TreeSet<Car>(new CarComparator()); 
for(Car c : originalCarList) 
{ 
    if(!carSet.add(c)) 
    { 
     duplicates.add(c); 
    } 
} 

最后,在你的duplicates你将拥有所有的副本。

+2

为什么不使用'HashSet'。它为所有操作提供o(1),而您选择的'TreeSet'为o(logn)。我错了吗? –

+1

使用Java 8: ' 设置 duplication =集合。newHashSet();如果(car.equals(car2)){ duplication.add(car2); }如果(car.equals(car2)){ }(car1,car2,car3).sorted([comparator] return car2; }); System.out.println(duplication); ' – chaiyachaiya

1

覆盖equals()hashCode()方法在Car类,并使用一个Set实现诸如HashSet,而不是ArrayList

+0

我不能碰车object..I Car对象的只是ArrayList中,我已经找到,如果列表中的任何汽车都有相同的名称。 ..... – Makky

5

试试这个:

List<Car> cars = getCars(); 
Set<String> names = new HashSet<String>(); 
for (Car car:cars) { 
    if (names.contains(car.getName()) { 
    duplicate(car); // some magic handler 
    } else { 
    names.add(car.getName()); 
    } 
} 

注:这会给你是重复的车名。一个后续的会从列表中的那些名称中提取出所有的汽车(如果你需要一辆新车对象)

+0

请参阅上述示例....无论如何感谢 – Makky

+0

此解决方案比最佳投票解决方案更好。这是具有o(n)空间的o(n)算法,但是另一种解决方案是o(nlogn) –

8

如果你有

class Car{ 
    String carName; 
    int carType; 
} 

List<Car> list; 
包含汽车列表

,那么你可以像

public static boolean hasDuplicates(List<Car> p_cars) { 
    final List<String> usedNames = new ArrayList<String>(); 
    for (Car car : p_cars) { 
     final String name = car.carName; 

     if (usedNames.contains(name)) { 
      return true; 
     } 

     usedNames.add(name); 
    } 

    return false; 
} 

的方法,以找出是否名单汽车有名字重复的汽车。

+0

一般来说'usedNames'必须是'HashSet',否则你会得到O(n)每次检查的复杂性。使用'HashSet'你会得到O(1)。 – WindRider

+0

@ Peri461这是标题,问题是:“我一定要找到,如果列表中具有相同名称的任何汽车” –

+0

好足够公平,我道歉。 – Peri461

0

我做了一个类似的计划,显示你的话是其中一个ArrayList重复(也它显示ArrayList的内容和较大的字符串)

哦,顺便说一句,变量和其他东西一样评论在西班牙语中,因为我说西班牙语:/但是,如果你看到代码,你可以看到我解决了2个问题的问题!

这是我的输出:

Ingrese un string: vaca 
Ingrese un string: perro 
Ingrese un string: dinosaurio 
Ingrese un string: gato 
Ingrese un string: cebra 
Ingrese un string: DiNoSauRiO 
Ingrese un string: VACA 
Ingrese un string: hamster 
Ingrese un string: gato 
Ingrese un string: canario 
Ingrese un string: elefante 
Ingrese un string: tortuga 
Ingrese un string: fin 

Posicion: 0 del array: vaca 

Posicion: 1 del array: perro 

Posicion: 2 del array: dinosaurio 

Posicion: 3 del array: gato 

Posicion: 4 del array: cebra 

Posicion: 5 del array: DiNoSauRiO 

Posicion: 6 del array: VACA 

Posicion: 7 del array: hamster 

Posicion: 8 del array: gato 

Posicion: 9 del array: canario 

Posicion: 10 del array: elefante 

Posicion: 11 del array: tortuga 

vuelta nro: 0 del primer for 

String: vaca no se repite con la posicion 1 
String: vaca no se repite con la posicion 2 
String: vaca no se repite con la posicion 3 
String: vaca no se repite con la posicion 4 
String: vaca no se repite con la posicion 5 
el string vaca se repite en la posicion 6 
String: vaca no se repite con la posicion 7 
String: vaca no se repite con la posicion 8 
String: vaca no se repite con la posicion 9 
String: vaca no se repite con la posicion 10 
String: vaca no se repite con la posicion 11 
vuelta nro: 1 del primer for 
String: perro no se repite con la posicion 2 
String: perro no se repite con la posicion 3 
String: perro no se repite con la posicion 4 
String: perro no se repite con la posicion 5 
String: perro no se repite con la posicion 6 
String: perro no se repite con la posicion 7 
String: perro no se repite con la posicion 8 
String: perro no se repite con la posicion 9 
String: perro no se repite con la posicion 10 
String: perro no se repite con la posicion 11 
vuelta nro: 2 del primer for 
String: dinosaurio no se repite con la posicion 3 
String: dinosaurio no se repite con la posicion 4 
el string dinosaurio se repite en la posicion 5 
String: dinosaurio no se repite con la posicion 6 
String: dinosaurio no se repite con la posicion 7 
String: dinosaurio no se repite con la posicion 8 
String: dinosaurio no se repite con la posicion 9 
String: dinosaurio no se repite con la posicion 10 
String: dinosaurio no se repite con la posicion 11 
vuelta nro: 3 del primer for 
String: gato no se repite con la posicion 4 
String: gato no se repite con la posicion 5 
String: gato no se repite con la posicion 6 
String: gato no se repite con la posicion 7 
el string gato se repite en la posicion 8 
String: gato no se repite con la posicion 9 
String: gato no se repite con la posicion 10 
String: gato no se repite con la posicion 11 
vuelta nro: 4 del primer for 
String: cebra no se repite con la posicion 5 
String: cebra no se repite con la posicion 6 
String: cebra no se repite con la posicion 7 
String: cebra no se repite con la posicion 8 
String: cebra no se repite con la posicion 9 
String: cebra no se repite con la posicion 10 
String: cebra no se repite con la posicion 11 
vuelta nro: 5 del primer for 
String: DiNoSauRiO no se repite con la posicion 6 
String: DiNoSauRiO no se repite con la posicion 7 
String: DiNoSauRiO no se repite con la posicion 8 
String: DiNoSauRiO no se repite con la posicion 9 
String: DiNoSauRiO no se repite con la posicion 10 
String: DiNoSauRiO no se repite con la posicion 11 
vuelta nro: 6 del primer for 
String: VACA no se repite con la posicion 7 
String: VACA no se repite con la posicion 8 
String: VACA no se repite con la posicion 9 
String: VACA no se repite con la posicion 10 
String: VACA no se repite con la posicion 11 
vuelta nro: 7 del primer for 
String: hamster no se repite con la posicion 8 
String: hamster no se repite con la posicion 9 
String: hamster no se repite con la posicion 10 
String: hamster no se repite con la posicion 11 
vuelta nro: 8 del primer for 
String: gato no se repite con la posicion 9 
String: gato no se repite con la posicion 10 
String: gato no se repite con la posicion 11 
vuelta nro: 9 del primer for 
String: canario no se repite con la posicion 10 
String: canario no se repite con la posicion 11 
vuelta nro: 10 del primer for 
String: elefante no se repite con la posicion 11 
vuelta nro: 11 del primer for 

el array es: [vaca, perro, dinosaurio, gato, cebra, DiNoSauRiO, VACA, hamster, gato, canario, elefante, tortuga] 

El array mas largo es: dinosaurio y tiene 10 caracteres 

Los Strings repetidos son[vaca, dinosaurio, gato] 

BUILD SUCCESSFUL (total time: 2 minutes 48 seconds)