[英]Java collections: Compare elements in collection with each other and remove in one cycle
說,我有一些地理位置的集合(格式為“ Country > Region [ > Town [ > District]]
),我想刪除彼此重疊的位置(例如, Europe > Germany
與Europe > Germany > Dresden
重疊Europe > Germany > Dresden
和Europe > Germany > Hamburg
,因此必須刪除最后兩個)。 我看到我需要兩個迭代器實例來進行如下操作:
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 提供的答案的建議的最終代碼如下所示:
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;
}
}
}
您確定要在內部循環中增加externalIterator嗎?
如果從外部迭代器中刪除對象,則需要在此之后立即跳出內部循環。 我不確定這是否可以完全解決您的問題,但可以使您更進一步。
如果仍然有問題,請顯示錯誤消息和/或異常!
我認為您應該為您的區域選擇不同的結構,例如一棵樹,其中每個位置都有包含它的子級。 這樣,您可以在簡單查找后排除所有重疊區域。 無需嵌套的迭代。
如果沒有一個位置可以與兩個位置重疊,則這種情況會更容易。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.