2013-09-25 98 views
8

插入重複我是新手,去渣。我有一個ArrayList,我想避免重複插入。我ArrayList的Java:避免在ArrayList中

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

和我要檢查該字段爲:

kar.getinsertkar(). 

我已閱讀,我可以使用HashSetHashMap,但我不知道。

+3

「但我不知道」你是什麼意思?使用'HashSet',就像你讀過的一樣。 –

+0

[線索](http://docs.oracle.com/javase/tutorial/collections/interfaces/set.html) – ajb

+0

注意,沒有規定說你不能有* *兩者的'ArrayList'和' HashSet'與相同的元素。你可以使用一個'ArrayList'來保存你想要的順序的元素,'HashSet'來檢查一個元素是否已經存在。 (這個檢查比搜索'ArrayList'快,但是維護兩個集合會減慢速度。)有時候這是正確的做事方式。 – ajb

回答

4

使用HashSet而不是ArrayList。但是,要真正使HashSet確實工作得很好,你必須重寫插入HashSet類/對象的equals()hashCode()方法。

敵人例如:

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

請參看下面的documentation用於覆蓋hashCode()equals()

+0

我使用的ArrayList遍佈在我班上的其他方法,我能怎樣改變? – user2766131

+0

+1很好的建議,我們可以指出的是,進入了集中的對象應該有一個適當的equals()和hashCode()方法來實現。 – vikingsteve

+0

在一個HashSet使用的方法應該是同一個ArrayList,因爲它們都實現了相同的接口。 – blackpanther

20

每當你想避免重複,要使用一個Set

在這種情況下,一個HashSet會就好了你。

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

爲了完整起見,我還建議您使用該類的通用(參數化)版本,假設Java 5或更高版本。

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

這會給你一些類型的安全以及獲取項目進出你的設置。

+4

並請使用參數化類型... – vikingsteve

+4

也通常我們使用瓦爾接口類型:'設置 stringSet =新的HashSet ();'不執行 – 2013-09-25 19:50:50

4

一套很簡單,可以不包含重複的,因此聽起來很適合你的集合。

這也是很容易實現。例如:

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

這將爲您提供一個可以保存String類型對象的集合。

要添加到組也很簡單:

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

由一組的定義,你可以添加任何你想要的,從來沒有碰到一個副本。

玩得開心!

編輯:如果你決定你是死心塌地使用一個ArrayList,這是簡單的一個對象是否已經在列表中添加它。例如:

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

注:我所有的例子都假定你正在使用String對象,但他們可以很容易地被交換到任何其他對象類型。

0

您需要使用任何Set實施,e.g您可以使用HashSet。 如果您想將add自定義對象kar納入您的HashSet,您需要overrideequalshashcode方法。 你可以閱讀更多關於equalshashcodesee