2016-02-10 16 views
-1

我有類TestObject帶有兩個變量:int A和int B. 我有一個TestObject的列表,我想刪除從列表中重複(包含相同的A和相同的乙可變對象。)從列表中刪除與其他對象重複的對象(獲得相同的變量)

  • 對象1(A = 1,B = 1)
  • 對象2(A = 2,B = 2 )對象3(A = 1,B = 1)

在這種情況下,我想從列表中刪除對象1或3,哪個並不重要。

對象是不同的情況下,這樣的標準:

LinkedHashSet<TestObject> hs = new LinkedHashSet<TestObject>(); 
    hs.addAll(TestObjectList); 
    new.clear(); 
    new.addAll(hs); 

這是行不通的。 有沒有簡單的方法來實現我的目標? 我嘗試使用iterator中的迭代器:

 ListIterator<TestObject> iter = TestObjectList.listIterator(); 
     while(iter.hasNext()){ 
      TestObject to = iter.next(); 
      ListIterator<TestObject> iter2 = TestObjectList.listIterator(); 
      while(iter2.hasNext()){ 
       TestObject to2 = iter2.next(); 
       if(to.A==to2.A && to.B == to2.B){ 
        iter.remove(); 
       } 
      } 
     } 

,但我得到以下異常:

異常線程 「main」 java.util.ConcurrentModificationException」上線 「的TestObject TO2 = iter2.next( );

Unfortunnately,我沒有別的想法有什麼辦法,我可以實現這個目標 也許還有一個更簡單的方法

。?
+2

爲什麼把它們放在'Set'不行?你在'TestObject'上覆蓋了'equals'和'hashCode'嗎? –

+0

你有沒有嘗試比較或比較。 –

+0

本網站有搜索功能。 – Raedwald

回答

3

正如@DeludedPsyche所說,你只需要讓TestObject支持正確的Java相等性檢查。然後,您可以將實例添加到Set,並重復「忽略」。

有很多很好的鏈接可以幫助您更好地瞭解這種工作方式/原因,例如, herehere

Eclipse中產生這對我來說:

@Override 
public int hashCode() { 
    final int prime = 31; 
    int result = 1; 
    result = prime * result + a; 
    result = prime * result + b; 
    return result; 
} 

@Override 
public boolean equals(Object obj) { 
    if (this == obj) { 
     return true; 
    } 
    if (obj == null) { 
     return false; 
    } 
    if (!(obj instanceof TestObject)) { 
     return false; 
    } 
    TestObject other = (TestObject) obj; 
    if (a != other.a) { 
     return false; 
    } 
    if (b != other.b) { 
     return false; 
    } 
    return true; 
} 
+0

這正是解決我的問題。更重要的是,非常感謝您的鏈接!他們幫助我理解這個問題。 – Thamiar

1
  1. 覆蓋equalshashcodeTestObject使用您的會員即A和B.
  2. 把所有TestObject對象爲Set實現類。
相關問題