2013-03-05 93 views
0

對於類ClassA,我有2個屬性-X和Y 我重寫了ClassA的equals方法,因此通過檢查屬性X找到2個類的等同關係。根據條件從插入集刪除重複元素

ClassA { 

Integer X,Y; 

Integer getX(){return X;} 
Integer getY(){return Y;} 

boolean equals(object o){ 
     return getX().equals((ClassA)o).getX()); 
} 

} 

現在我想從列表中刪除ClassA的所有重複元素 但是,如果發現2個元素重複,我想添加一個邏輯刪除基於Y條件的重複元素。 所以基本上它會像下面

if(A.eqauls(B)){ 
    remove A , if A.getY() > B.getY() 
    ore remove B , if A.getY() < B.getY() 
} 

很顯然,我會嘗試對列表進行排序,看看周邊重複的元素,然後除去基於我們的邏輯重複。 我不知道我是否可以使用集合來做到這一點。

回答

0

集合使用equals()方法來確定元素是否已經在集合中。換句話說,如果你只是使用正常的插入,插入到集合中的第一個將會是你被卡住的那個。

我不認爲你可以重寫這種行爲(除非你實現你自己的集合類,你改變add方法來測試相等性做我們的Y比較)。

0

如果不打破Set的總體合同,即add()將永遠不會添加元素(根據equals()方法)將不會添加到該集合中已有的元素。顯然,如果你正在實現這種行爲,你可以使用 a Set(你可以檢查你是否已經看到一個具有特定值X的元素)。 A Map將是一個稍微好一點的選擇。

由於行爲很容易通過對列表進行排序和循環實現,所以我會使用它。使用Set(可以說讓你的代碼難以閱讀)你不會在實現時間和可維護性方面獲得任何收益,所以它確實是一個更好的選擇。

1

事情是這樣的:

Map<ClassA, ClassA> map = new HashMap(); 

for(ClassA elem : yourList) 
{ 
    ClassA existing = map.get(elem); 
    if(existing != null) 
    { 
     if(check your condition using "elem" and "existing" and getY) 
     { 
     continue;// don't replace the element in the map. 
     } 
    } 
    map.put(elem, elem); 
} 
//map.values() will have your elements 

,如果你想保留元素的順序在列表中你也可以使用LinkedHashMap代替。

順便說一下,HashSet是以類似的方式使用HashMap實現的。