2011-09-02 17 views
9

ho un ArrayList<Car>Ricerca di valori duplicati in arraylist

Per esempio

class Car{ 
    String carName; 
    int carType; 
} 

Ora, devo trovare se la lista ha qualche vetture che hanno lo stesso nome. Qual è il modo migliore per farlo?

risposta

22

Creare un comparatore di prezzi:

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

Ora aggiungere tutte le vetture del ArrayList ad un SortedSet, preferibilmente TreeSet; se ci sono duplicati aggiungere alla lista dei duplicati:

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

Infine nelle vostre duplicates avrete tutti i duplicati.

+2

Perché non usare 'HashSet'. Fornisce o (1) per tutte le operazioni mentre la tua scelta 'TreeSet' è o (logn). Ho sbagliato? –

+1

Con Java 8 flavor: ' Set duplicazione = Imposta.newHashSet(); Stream.of (car1, car2, car3) .sorted ([comparatore]). Reduce ((auto, auto2) -> { if (car.equals (car2)) { duplication.add (car2); } ritorno car2; }); System.out.println (duplicazione); ' – chaiyachaiya

1

Override equals() e hashCode() metodi nella classe Car e utilizzare un'implementazione Set come HashSet invece di ArrayList.

+0

non posso toccare la macchina object..I solo l'arraylist di oggetto Car allora ho da trovare se qualsiasi auto nella lista ha lo stesso nome. ..... – Makky

5

Prova questa:

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: questo vi darà i nomi di automobili che sono duplicati. Un follow on sarebbe l'estrazione di tutte le auto con i nomi della lista (se avete bisogno gli oggetti auto)

+0

vedere l'esempio sopra .... Grazie comunque – Makky

+0

Questa soluzione è decisamente migliore della soluzione più votata. Questo è o (n) algoritmo con o (n) spazio ma l'altra soluzione è o (nlogn) –

8

Se hai

class Car{ 
    String carName; 
    int carType; 
} 

e

List<Car> list; 

che contiene un elenco di auto, allora si potrebbe avere un metodo come

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

per scoprire se l'elenco dei le auto hanno macchine con nomi duplicati.

+0

In generale' usedNames' deve essere un 'HashSet' altrimenti si ottiene O (n) complessità di ciascun controllo. Con 'HashSet' ottieni O (1). – WindRider

+0

@ Peri461 era il titolo, la domanda era "Devo trovare se la lista ha delle macchine con lo stesso nome" –

+0

Okay abbastanza giusto, mi scuso. – Peri461

0

ho fatto un programma simile che vi mostra le parole che dove ripetuto in un ArrayList (anche esso mostra il contenuto ArrayList e la stringa più grande)

Oh, a proposito, le variabili, e altre cose del genere commenti sono in spagnolo, perché parlo spagnolo:/ma, se vedi il codice puoi vedere che ho risolto il problema con 2 buche per!

Questa è la mia uscita:

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) 
Problemi correlati