2011-09-02 16 views
9

tengo una ArrayList<Car>encontrando en ArrayList

Por ejemplo

class Car{ 
    String carName; 
    int carType; 
} 

Ahora, tengo que encontrar si la lista tiene carros que tienen mismo nombre. ¿Cuál es la mejor manera de hacer esto?

Respuesta

22

Crear un comparador:

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

Ahora suma todos los coches de la ArrayList a un SortedSet, preferiblemente TreeSet; si hay duplicados se suman a la lista de duplicados:

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); 
    } 
} 

Por último, en sus duplicates tendrá todos los duplicados.

+2

¿Por qué no usar 'HashSet'. Proporciona o (1) para todas las operaciones, mientras que su opción 'TreeSet' es o (logn). ¿Me equivoco? –

+1

Con sabor Java 8: ' Conjunto duplicación = Conjuntos.newHashSet(); Stream.of (car1, car2, car3) .sorted ([comparator]). Reduce ((car, car2) -> { if (car.equals (car2)) { duplication.add (car2); } return car2; }); System.out.println (duplicación); ' – chaiyachaiya

1

Anulación equals() y hashCode() métodos de su clase Car y utilizar una aplicación Set como HashSet en lugar de ArrayList.

+0

no puedo tocar el coche object..I sólo el ArrayList de objeto Car entonces he de encontrar si alguna coches de la lista tiene el mismo nombre. ..... – Makky

5

Prueba esto:

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()); 
    } 
} 

Nota: esto le dará los nombres de coche que son duplicados. Un seguimiento en la que se extrae todos los coches con los nombres de la lista (si es necesario los objetos de coches)

+0

vea el ejemplo anterior ... Gracias de todos modos – Makky

+0

Esta solución es mucho mejor que la solución mejor votada. Este es o (n) algoritmo con o (n) espacio pero la otra solución es o (nlogn) –

8

Si tiene

class Car{ 
    String carName; 
    int carType; 
} 

y

List<Car> list; 

que contiene una lista de coches, entonces usted podría tener un método como

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; 
} 

para averiguar si la lista de los automóviles tienen autos con nombres duplicados.

+0

En general,' usedNames' debe ser un 'HashSet'; de lo contrario, obtendrá O (n) complejidad de cada comprobación. Con 'HashSet' obtienes O (1). – WindRider

+0

@ Peri461 que era el título, la pregunta era "Tengo que encontrar si la lista tiene algún automóvil que tenga el mismo nombre" –

+0

Muy bien, me disculpo. – Peri461

0

lo hice un programa similar que muestra las palabras que, cuando se repite en un ArrayList (también se muestra el contenido de ArrayList y la cadena más grande)

Ah, por cierto, las variables, y otras cosas como comentarios están en español, porque hablo español:/pero, si ves el código, puedes ver que resolví el problema con 2 bucles.

Este es mi resultado:

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) 
Cuestiones relacionadas