2011-09-02 53 views
9

Tôi có một ArrayList<Car>Finding giá trị trùng lặp trong ArrayList

Ví dụ

class Car{ 
    String carName; 
    int carType; 
} 

Bây giờ, tôi phải tìm nếu danh sách có bất kỳ chiếc xe có cùng tên. Cách tốt nhất để làm việc này là gì?

Trả lời

22

Tạo một so sánh:

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

Bây giờ thêm tất cả những chiếc xe của ArrayList đến một SortedSet, tốt nhất TreeSet; nếu có các trùng lặp thêm vào danh sách các bản sao:

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

Cuối cùng, trong duplicates bạn sẽ có tất cả các bản sao.

+2

Tại sao không sử dụng 'HashSet'. Nó cung cấp o (1) cho tất cả các hoạt động trong khi bạn chọn 'TreeSet' là o (logn). Liệu tôi có sai? –

+1

Với hương vị Java 8: ' Đặt sao chép = Bộ.newHashSet(); Stream.of (car1, car2, car3) .sắp ((ô tô, car2) -> { nếu (car.equals (car2)) { sao chép.add (car2); } trả lại ô tô2; }); System.out.println (sao chép); ' – chaiyachaiya

1

Override equals()hashCode() phương pháp trong lớp Car của bạn và sử dụng thực hiện Set như HashSet thay vì ArrayList.

+0

tôi không thể chạm vào xe object..I chỉ ArrayList của đối tượng xe sau đó tôi đã tìm nếu có chiếc xe trong danh sách có cùng tên. ..... – Makky

5

Hãy thử điều này:

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

Lưu ý: đây sẽ cung cấp cho bạn tên chiếc xe đó là trùng lặp. Một tiếp theo trên sẽ được giải nén tất cả các xe ô tô với những cái tên trong danh sách (nếu bạn cần các đối tượng xe)

+0

xem ví dụ trên .... Thanks anyway – Makky

+0

Giải pháp này là cách tốt hơn so với giải pháp bình chọn tốt nhất. Đây là thuật toán o (n) với không gian o (n) nhưng giải pháp khác là o (nlogn) –

8

Nếu bạn có

class Car{ 
    String carName; 
    int carType; 
} 

List<Car> list; 

có chứa một danh sách các xe hơi, sau đó bạn có thể có một phương pháp như

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

để tìm hiểu xem danh sách các ô tô có ô tô có tên trùng lặp.

+0

Nói chung' usedNames' phải là một 'HashSet' nếu không bạn sẽ nhận được O (n) phức tạp của mỗi kiểm tra. Với 'HashSet' bạn nhận được O (1). – WindRider

+0

@ Peri461 đó là tiêu đề, câu hỏi là "Tôi phải tìm nếu danh sách có bất kỳ chiếc xe có cùng tên" –

+0

Được rồi, đủ công bằng, tôi xin lỗi. – Peri461

0

tôi đã làm một chương trình tương tự chỉ ra cho bạn những lời đó mà lặp đi lặp lại trong một ArrayList (còn nó cho thấy nội dung ArrayList và chuỗi lớn hơn)

Oh, bằng cách này, các biến, và các công cụ khác như ý kiến ​​được bằng tiếng Tây Ban Nha, vì tôi nói tiếng Tây Ban Nha:/nhưng, nếu bạn thấy mã, bạn có thể thấy rằng tôi đã giải quyết vấn đề với 2 bucles cho!

Đây là kết quả của tôi:

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) 
Các vấn đề liên quan