2012-01-25 154 views
2

我一直在遇到類似下面的代碼的技術,我需要從列表中篩選出一種枚舉類型。刪除列表中的項目類型

有沒有更有效的方法來做到這一點?

private List<TestResult> removeInfo(List<TestResult> testResults) { 
    List<TestResult> tmpT = new ArrayList<TestResult>(); 
    for(TestResult t : testResults) { 
     if(!t.getSeverity().equals(Severity.INFO)) { 
      tmpT.add(t); 
     } 
    } 
    return tmpT; 
} 

收藏將是我的第一個想法,但不確定。

乾杯 d

+1

我想你會通過使用一個實際的迭代器和一個LinkedList來得到一些改進,因爲清除將是O(1)。 http://stackoverflow.com/questions/322715/when-to-use-linkedlist-over-arraylist – Marvo

+0

這些對象是如何在列表中結束的?我的意思是在這裏刪除'Severity.INFO',但另一部分代碼創建和使用它的權利? – Cratylus

+0

正確,它確實被使用,但在這種情況下它是這樣的,所以我不必將許多嚴重性.INFO傳遞到前端 - 只需要使用警告和錯誤 – dale

回答

0

可以過濾使用迭代就地名單:

Iterator<TestResult> iterator = testResults.iterator(); 
while(iterator.hasNext()) { 
    TestResult result = iterator.next(); 
    if (!result.getSeverity().equals(Severity.INFO)) { 
     iterator.remove(); 
    } 
} 

//Now testResults contains all elements that do not have Severity of INFO 

這是Marvo的評論的例子。它的內存效率更高,但代碼效率更高。同樣,Marvo說你可以通過使用LinkedList來改進。但是,除非你處理大量的數據,否則我不認爲你會發現有什麼不同。

+0

乾杯,該列表可能有大約1-2000個結果。編輯列表非常有意義,而不是創建一個新的列表 – dale

0

谷歌的Guava有一些有效的方式,這一點:

private Iterable<TestResults> removeInfo(List<TestResults> list){ 
    return Iterables.filter(list, new Predicate<TestResults>(){ 
     public boolean apply(TestResults input){ 
      return !input.getSeverity.equals(Severity.INFO); 
     } 
    } 
} 

這並不是在所有複製的數據,猶若列表的迭代器不支持刪除Works。

+0

不錯,我會把這個轉發給它,但是當新的jar被添加到系統中時,它總是很忙,但是如果它改進了系統,那麼爲什麼不呢! – dale

+0

我會強烈推薦它。番石榴是一個非常有用的圖書館,用於收藏,IO,功能等。 – TDJoe

+0

確實,我們今天已經看到了這一點,並且是我們要採取的路線,歡呼聲。 – dale