2010-07-13 56 views
4

說,我收集了一些地理位置(格式爲Country > Region [ > Town [ > District]]),我想刪除彼此重疊的位置(例如,Europe > Germany重疊Europe > Germany > DresdenEurope > Germany > Hamburg,所以最後兩個必須刪除)。我知道我需要迭代器的兩個實例,使這樣的事情:Java集合:將集合中的元素彼此進行比較並在一個週期內將其刪除

final Iterator<Location> outerIterator = locations.newIterator(); 
while (outerIterator.hasNext()) { 
    final Location outer = outerIterator.next(); 
    final Iterator<Location> innerIterator = locations.newIterator(); 
    while (innerIterator.hasNext()) {    
     final Location inner = innerIterator.next(); 
     if (!inner.equals(outer)) { 
      if (inner.overlaps(outer)) outerIterator.remove(); 
      else if (outer.overlaps(inner)) innerIterator.remove(); 
     } 
    } 
} 

但我不能爲同一個集合獲得新Iterator。我的算法是不正確的還是有辦法做到這一點?


通過Carl Smotricz使用從answer provided的建議最終代碼如下所示:

final Iterator<JobLocation> outerIterator = locations.iterator(); 
while (outerIterator.hasNext()) { 
    final JobLocation outer = outerIterator.next();   
    final Iterator<JobLocation> innerIterator = locations.iterator(); 
    while (innerIterator.hasNext()) { 
     final JobLocation inner = innerIterator.next(); 
     if (!inner.equals(outer) && inner.overlaps(outer)) { 
      outerIterator.remove(); 
      break; 
     } 
    } 
} 
+0

你應該爲此考慮一個更好的數據結構,或許像樹一樣分層。它會讓你的生活更輕鬆。事情會更易於管理,可讀性更強,速度更快等。 – polygenelubricants 2010-07-13 10:25:27

+0

這個代碼是針對GWT的問題,它已經有點複雜了。事實上,層次樹保存在服務器端,我剛剛通過RPC獲得了客戶端的實例。 – 2010-07-13 11:46:18

回答

2

如果您從外部迭代器中刪除一個對象,則需要在之後立即跳出內部循環。我不確定這是否能夠完全解決您的問題,但它可能會讓您更進一步。

如果仍有問題,請顯示錯誤信息和/或異常!

+0

我需要刪除幾個元素,所以我不能在這裏打破。 在例子中的代碼的情況下,我經常遇到'ConcurrentModificationException',它遵循集合的邏輯,但不是我的問題的答案 – 2010-07-13 10:00:43

+1

如果你剛剛刪除外循環指向的對象,那絕對沒有意義繼續內部循環,將元素與最近已故的'outer'進行比較。我主張脫離內在循環,而不是兩者。想想吧! – 2010-07-13 10:07:32

+0

是的,你完全正確,我會在問題中添加最終代碼 – 2010-07-13 12:54:04

3

你確定你的意思是你增加在outerIterator內循環?

+1

好的。這對我來說也是錯誤的。 – 2010-07-13 09:13:08

+0

是的,這當然是錯的,謝謝。解決這個問題 – 2010-07-13 09:20:28

2

我認爲你應該選擇爲你的區域使用不同的結構,比如每個位置都有它包含的子項的樹。通過這種方式,您可以在簡單查找後排除與另一個區域重疊的所有區域。不需要嵌套迭代。

如果沒有位置可以與兩個位置重疊,這似乎更容易,這似乎是這種情況。

相關問題