簡體   English   中英

Java集合:將集合中的元素相互比較,並在一個周期內刪除

[英]Java collections: Compare elements in collection with each other and remove in one cycle

說,我有一些地理位置的集合(格式為“ Country > Region [ > Town [ > District]] ),我想刪除彼此重疊的位置(例如, Europe > GermanyEurope > Germany > Dresden重疊Europe > Germany > DresdenEurope > 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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM