2012-08-09 32 views
0

我必須添加唯一元素到ArrayList。我怎樣才能爲此覆蓋equals方法?我想是這樣的:如何使用equals()創建獨特元素的ArrayList

public boolean equals (Object in) { 
    if(in == null) { 
     return false; 
    } 
    else if(in instanceof UniqueFruits) { 
     // ?? check whether the newly added element exists or not   
     return true; 
    } 
    else { 
     return false; 
    }  
} 

如何檢查新添加的元素是否存在?我必須檢查水果名稱。

+0

爲了做到這一點,你必須重寫'equals'和'hashCode'方法。 – 2012-08-09 04:00:24

+0

但是如何?我需要檢查部分的代碼。 – 2012-08-09 04:02:28

+0

您必須比較裏面的屬性值,你的'如果(在的instanceof UniqueFruits){...}'代碼返回true或false,這取決於你的規則,像水果的名字或任何你想/需要 – 2012-08-09 04:03:33

回答

2

這聽起來像你想使用Set實現。如果順序並不重要,只要使用HashSet。如果你想保留插入順序,使用LinkedHashSet。或者,保持自然排序,使用TreeSet

在任何情況下,請務必覆蓋你的元素對象的方法equals。你有什麼是一個好開始。 NG in instanceof UniqueFruits,投inUniqueFruits

UniqueFruits uf = (UniqueFruits)in; 

就可以檢查使用equals各相關領域依次(請務必檢查null第一個字段爲空)。任何現代IDE將幫助您自動生成equals。先嚐試一下,然後再與生成的版本進行比較可能會有教育意義。

確保也覆蓋hashCode(IDEs將同樣幫助您解決這個問題,並且網上有大量關於此事的文章 - 只是搜索)。

如果使用TreeSet(或其他一些SortedSet實現),你的元素對象要麼實現Comparable否則你應該提供SortedSetComparator

+0

+1表示「使用集合,而不是列表」。 – 2012-08-09 11:39:42

1

我建議使用Set而不是ArrayList來存儲獨特的元素。它更簡單,更清潔。

按照該javadocSet,這裏就是這樣說的:

不包含重複元素的集合。更正式地說,集合 不包含元素對e1和e2,使得e1.equals(e2)和 中最多一個爲null元素。正如其名稱所暗示,此接口的型號 的數學集合抽象

這裏是一個SO article談到有關如何從ArrayList刪除重複的元素。但是,您會注意到提供的大多數解決方案都使用了Set的實現來實現您想要執行的操作。在任何情況下,如您所做的那樣重覆equals()將無助於實現您的目標。 如果不是太麻煩的(我不明白爲什麼你需要一個ArrayList堅持以你的實際需要,我會強烈建議移動到Set實現。

+0

我知道設置可以幫助更好,但我只需要一個ArrayList。 – 2012-08-09 04:08:53

+0

@NihalSharma爲什麼? – 2012-08-09 04:10:36

+0

我有一個測試,他們要求。我無法解決它。 – 2012-08-09 04:23:50

0

如果您fruitname類有2個屬性,如fruitnamefruitclass然後

你的校驗碼應該是

UniqueFruits current = (UniqueFruits) in; 
if(this.fruitname.equals(current.fruitname) && this.fruitclass.equals(current.fruitclass)) { 
    return true; 
}else{ 
    return false; 
} 

和未來的hashCode時問你的IDE生成hasdcode爲UniqueFruits類。 並使用Set,而不是ArrayList

開句玩笑了您的IDE甚至可以生成equals()方法適合你。