2013-09-25 64 views
8

Tôi là người mới sử dụng java. Tôi có ArrayList và tôi muốn tránh trùng lặp khi chèn. ArrayList tôi làJava: Tránh chèn trùng lặp trong mảng danh sách

ArrayList<kar> karList = new ArrayList<kar>(); 

và lĩnh vực Tôi muốn kiểm tra là:

kar.getinsertkar(). 

Tôi đã đọc mà tôi có thể sử dụng HashSet hoặc HashMap nhưng tôi không có đầu mối.

+3

"nhưng tôi không có đầu mối" Ý của bạn là gì? Sử dụng một 'HashSet', giống như bạn đã đọc. –

+0

[đầu mối] (http://docs.oracle.com/javase/tutorial/collections/interfaces/set.html) – ajb

+0

Lưu ý rằng không có quy tắc nào nói rằng bạn không thể có * cả * một 'ArrayList' và một' HashSet' với cùng các phần tử. Bạn có thể sử dụng một 'ArrayList' để giữ các phần tử theo thứ tự bạn muốn, và một' HashSet' để kiểm tra xem một phần tử đã có mặt chưa. (Kiểm tra sẽ nhanh hơn việc tìm kiếm 'ArrayList', nhưng việc duy trì hai bộ sưu tập sẽ làm chậm mọi thứ xuống.) Đôi khi đây là cách đúng đắn để làm việc. – ajb

Trả lời

4

Sử dụng HashSet thay vì ArrayList. Tuy nhiên, để thực sự làm cho HashSet thực sự hoạt động tốt, bạn phải ghi đè các phương thức equals()hashCode() của lớp/đối tượng được chèn vào HashSet.

Foe ví dụ:

Set<MyObject> set = new HashSet<MyObject>(); 
set.add(foo); 
set.add(bar); 

public class MyObject { 
    @Override 
    public boolean equals(Object obj) { 
     if (obj instanceof MyObject) 
      return (this.id = obj.id) 
     else 
      return false; 
    } 
    // now override hashCode() 
} 

Hãy xem documentation sau cho trọng hashCode()equals().

+0

Tôi sử dụng arraylist trên tất cả các lớp của tôi cho các phương pháp khác, làm thế nào tôi có thể thay đổi nó? – user2766131

+0

+1 gợi ý tốt, và chúng tôi có thể chỉ ra rằng các đối tượng đi vào tập hợp phải có phương thức equals() và hashCode() thích hợp được triển khai. – vikingsteve

+0

Các phương pháp được sử dụng trong HashSet phải giống như một ArrayList vì cả hai đều triển khai cùng một giao diện. – blackpanther

20

Bất cứ khi nào bạn muốn ngăn trùng lặp, bạn muốn sử dụng Set.

Trong trường hợp này, một HashSet sẽ tốt cho bạn.

HashSet karSet = new HashSet(); 
karSet.add(foo); 
karSet.add(bar); 
karSet.add(foo); 
System.out.println(karSet.size()); 
//Output is 2 

Để hoàn chỉnh, tôi cũng khuyên bạn nên sử dụng phiên bản chung (tham số) của lớp, giả sử Java 5 hoặc cao hơn.

HashSet<String> stringSet = new HashSet<String>(); 
HashSet<Integer> intSet = new HashSet<Integer>(); 
...etc... 

Điều này sẽ cung cấp cho bạn một số loại an toàn cũng như nhận được các mục trong và ngoài bộ của bạn.

+4

và vui lòng sử dụng loại tham số ... – vikingsteve

+4

Ngoài ra, chúng tôi thường sử dụng giao diện cho loại vars: 'Đặt stringSet = new HashSet ();' không thực hiện –

4

Một bộ chỉ đơn giản là một bộ sưu tập có thể không chứa bản sao như vậy nó có vẻ hoàn hảo cho bạn.

Nó cũng rất đơn giản để thực hiện. Ví dụ:

Set<String> mySet = new HashSet<String>(); 

Điều này sẽ cung cấp cho bạn tập hợp có thể chứa Đối tượng loại chuỗi.

Để thêm vào các thiết lập chỉ đơn giản:

mySet.add("My first entry!"); 

Theo định nghĩa của một bộ, bạn có thể thêm bất cứ điều gì bạn muốn và không bao giờ chạy vào một trùng lặp.

Hãy vui vẻ!

EDIT: Nếu bạn quyết định bạn đã chết bằng cách sử dụng ArrayList, thật đơn giản để xem một đối tượng đã có trong danh sách trước khi thêm nó chưa.Ví dụ:

public void addToList(String newEntry){ 
    if(!myList.contains(newEntry)) 
     myList.add(newEntry); 
} 

Lưu ý: Tất cả các ví dụ của tôi cho rằng bạn đang sử dụng đối tượng String nhưng chúng có thể dễ dàng hoán đổi với bất kỳ loại Đối tượng nào khác.

0

Bạn cần sử dụng bất kỳ triển khai Set nào, ví dụ: bạn có thể sử dụng HashSet. Nếu bạn muốn add đối tượng tùy chỉnh kar vào số HashSet của mình, bạn cần phải overrideequals và phương thức hashcode. Bạn có thể đọc thêm về equalshashcode, see

Các vấn đề liên quan