2012-08-13 78 views
0

假設我有一個包含單個值或值範圍的列表。現在,如果我向此列表中添加新值或範圍,它可能會與當前值/範圍的多個重複。所有這些重疊的對象應該被組合起來創建一個新的實例,該實例應該被添加到列表中,同時包含在新實例中的對象需要從原始列表中刪除。過濾列表值,我應該創建一個新列表還是刪除原始列表中的值

所以我的問題是,我真的應該從列表中刪除這些對象還是在每次迭代時創建一個新列表。也就是說,把代碼:

解決方案1個

for (Range newObj : newItems){ 
    Iterator it = oList.iterator(); 
    while (it.hasNext()){ 
    Range o = it.next(); 
    if (canCombine(newObj, o)){ 
     newObj = combine(newObj, o); 
     it.remove(); 
    } 
    } 
    oList.add(newObj); 
} 

解決方案2

for (Range newObj : newItems){ 
    List newList = new ArrayList(); 
    for (Range o : oList){ 
    if (canCombine(newObj, o)){ 
     new = combine(newObj, o); 
    } else { 
     newList.add(o); 
    } 
    } 
    newList.add(newObj); 
    oList = newList; 
} 

也許另一種解決方案是更好的。如果是這樣,請讓我知道。

+2

「也許另一種解決方案更好」這是正確的:[間隔樹提供更好的解決方案](http://en.wikipedia.org/wiki/Interval_tree)。 – dasblinkenlight 2012-08-13 16:12:36

+0

你在列表中使用Object的事實對我來說很不好。 爲什麼不定義一個範圍(from,to)對象。這將封裝單個值和非零範圍。你的組合邏輯不需要反思它通過了什麼對象(因爲我懷疑你現在這樣做) – 2012-08-13 16:14:49

+0

@BrianAgnew我實際上並沒有使用Object,這是因爲缺乏對象的好名字。我實際上使用了一個抽象類,它是由一個範圍和一個值類實現的。 – Deiwin 2012-08-13 16:17:00

回答

0

我認爲你可以避免每次迭代newItems時創建newList,或者你可以避免創建新的列表。

for (Object newObj : newItems){ 
    for(int i=0;i<oList.size();i++){ 
     if (canCombine(newObj, oList.get(i))){ 
      newObj = combine(newObj, oList.get(i)); 
      oList.remove(i); 
     }  
     } 
     oList.add(newObj); 
    } 
+0

這應該使用迭代器。但我明白你的意思。我會改進這個問題。 – Deiwin 2012-08-13 17:09:51