2015-08-26 115 views
0

我有一個數組完整的對象,如果兩個對象是相同的,我想刪除它們兩個。刪除所有重複列表成員

這是我目前的做法,它返回一個

java.util.ConcurrentModificationException

public void deleteDuplicates(ArrayList<Object> objectArrayList){ 

    Iterator<Object> objectIterator = objectArrayList.iterator(); 
    Iterator<Object> objectIterator2 = objectArrayList.iterator(); 

    while(objectIterator.hasNext()){ 
     Object object = objectIterator.next(); 

     while(objectIterator2.hasNext()){ 
      if(object.equals(objectIterator2.next())){ 
       objectIterator2.remove(); 
       objectIterator.remove(); 
      } 
     } 
    } 
} 
+0

但是它的外觀,如果我們正在挑剔,你有一個['ArrayList'](http://docs.oracle.com/javase/7/docs/api/java/ util/ArrayList.html),它是['List'](http://docs.oracle.com/javase/7/docs/api/java/util/List.html),而不是[數組](http ://docs.oracle.com/javase/specs/jls/se7/html/jls-10.html#jls-10.1):-)。 – Edd

+0

編輯標題,謝謝 –

+0

如果您在兩者之間移除某些元素,如何才能從元素移至元素? – MaxZoom

回答

0

此代碼將刪除所有列表成員是一次比現在更。

該方法處理奇數個重複。所以它不會檢測並刪除重複對,因爲這可能會讓孤兒重複。相反,它首先計數,然後刪除重複。

public static void deleteDuplicates(List<Object> objectList) { 
    HashMap<Object,Integer> counts = new HashMap<>(); 
    for (Object o : objectList) { 
     int oldCount = counts.containsKey(o) 
      ? counts.get(o).intValue() 
      : 0; 
     counts.put(o, oldCount + 1); 
    } 

    for (Iterator<Object> it = objectList.iterator(); it.hasNext();) { 
     Object o = it.next(); 
     if (1 < counts.get(o)) { 
      it.remove(); 
     } 
    } 
} 

注意,這種方法要求該列表成員的hashCode()方法滿足由Object.hashCode()指定的合同,其中包括:

如果兩個對象根據equals相等(Object)方法,然後在兩個對象的每一個上調用hashCode方法必須產生相同的整數結果。