2013-05-01 63 views
-1

有人可以向我解釋爲什麼以下不起作用(跑道是Hibernate PersistentSet)?從Set迭代器中刪除

System.out.println("size before " + runways.size()); 
Iterator<Runway> deleteIterator = runways.iterator(); 
while (deleteIterator.hasNext()) { 
    Runway rwy = deleteIterator.next(); 
    if (rwy == rwy3) { 
     System.out.println("remove !"); 
     deleteIterator.remove(); 
    } 
} 
System.out.println("size after " + runways.size()); 

我得到的System.out日誌:

INFO: size before 3 
INFO: remove ! 
INFO: size after 3 

我想通過迭代器,刪除是安全的和可行的。 您看到日誌「刪除」!這表明調用了remove()方法。

編輯:PersistentSet有從Iterator接口刪除方法的問題。

+0

你可以用簡短但完整的例子來展示這個嗎? (類似的版本適用於我...) – 2013-05-01 16:07:26

+1

嗯...我只是試過這個,它對我的​​預期工作 – 2013-05-01 16:10:14

+0

跑道是一個HashSet facewindu 2013-05-01 16:10:33

回答

3

檢查以確保您的hashCode()equals()方法在您的Runway對象上被覆蓋並更正。

+1

他看到System.out被調用,這表明他已經在if區塊。 – Nicholas 2013-05-01 16:12:58

+1

因爲它進入了'if'模塊,所以這不是問題。 – 2013-05-01 16:13:00

+1

不,這是一個非常相關的問題 – 2013-05-01 16:14:53

3

//編輯:僅供參考此代碼是失敗代碼的示例。正確覆蓋您的equals()hashCode()

要跟進JustinKSU的角度來看,如果你不實現你hashCode()equals()好,你在做什麼都不行。我可以複製你的情況,如果我泥濘的equals()hashCode()

public static void main(String[] args) { 
    Set<Runway> runways = new HashSet<Runway>(); 
    Runway rwy1 = new Runway(); 
    Runway rwy2 = new Runway(); 
    Runway rwy3 = new Runway(); 
    runways.add(rwy1); 
    runways.add(rwy2); 
    runways.add(rwy3); 
    System.out.println("size before " + runways.size()); 
    Iterator<Runway> deleteIterator = runways.iterator(); 
    while (deleteIterator.hasNext()) { 
     Runway rwy = deleteIterator.next(); 
     if (rwy == rwy3) { 
      System.out.println("remove !"); 
      deleteIterator.remove(); 
     } 
    } 
    System.out.println("size after " + runways.size()); 
} 

private static class Runway { 
    @Override 
    public boolean equals(Object obj) { 
     return false; 
    } 

    @Override 
    public int hashCode() { 
     return (new Random()).nextInt(); 
    } 
} 
+1

+1;很好的例子!也許你應該添加**這個代碼是錯誤的**免責聲明 – home 2013-05-01 16:37:09

0

我的equals和hashCode方法是由Eclipse自己創建的。所以它不是來自他們。

但是我在問題開始時太快了。我忘了跑道是從休眠模式(而不是java.util.HashSet中)

一個PersistentSet我發現這個bug這explaines爲什麼它是不可能從一個PersistenSet迭代器中刪除對象。

這個錯誤似乎過時了,也很難解決。 我唯一的選擇是從第一個然後重新創建一個集合,而沒有我不想要的元素。