2011-08-05 90 views
2

我需要過濾大小爲1000或更大的列表並從中獲取子列表。 我不想使用迭代器。在不使用迭代器的情況下過濾列表

1)目前我正在迭代List並使用Java進行比較。這是一項耗時的工作。我需要提高我的代碼的性能。

2)我也嘗試使用Google Collections(Guava),但我認爲它也會在後臺進行迭代。

Predicate<String> validList = new Predicate<String>(){ 
     public boolean apply(String aid){ 
      return aid.contains("1_15_12"); 
     } 
    }; 
    Collection<String> finalList =com.google.common.collect.Collections2.filter(Collection,validList); 

任何人都可以建議我怎麼能得到更快的子表不反覆或者,如果使用迭代器我會得到比較結果更快。

+5

1000不是一個很大的數字。它是一個順序訪問的列表,迭代是不可避免的。 – Nivas

+1

我認爲迭代器在過濾期間是不可避免的,因爲每個元素都必須被檢查。 –

+0

@Nivas:你的評論應該是一個回答 –

回答

0

列表是對象的有序集合。所以你必須迭代它才能過濾。

+0

對不起,Nivas似乎已經回答了這個問題...... – never

2

考慮如果您在子列表中調用size()會發生什麼情況。那檢查每個元素,因爲每個元素可能會改變結果。

如果您在使用您的列表,這意味着你不接觸的每一個元素在裏面,不使用隨機訪問等一個非常特殊的方式,也許你不想List接口都沒有。如果你能告訴我們更多關於你在做什麼,那真的會有所幫助。

+0

好評,不好回答。 –

+0

@ Gabriel:我認爲它*是一個答案:如果他需要List的一般接口,他將無法比遍歷整個列表做得更好。如果他*不需要整個'List'接口,他可以使用不同的接口,這可能是可行的,而無需迭代。 –

+0

從理論上講,這不完全正確。根據使用情況(如您所寫),他可以使用List with Constraints,按特定順序添加到List中,以防止迭代整個Collection並停留在List上。但這取決於,我不會給出這樣的答案,我會把它作爲一個評論,以獲得更多的信息和事後回答,給他一個解決他的問題。由於這是主觀的,我收回我的downvote(如果你編輯)。 –

0

我充實了我的意見: 我認爲迭代器在過濾期間是不可避免的,因爲每個元素都必須被檢查。

關於Collections2.filter,它與簡單過濾器不同:返回的Collection仍爲「被預測」。這意味着如果將不滿意的元素添加到Collection,則會拋出IllegalArgumentException

0

如果性能真的是你關心的問題,那麼很可能謂詞很慢。你可以做什麼是Lists.partition你的列表,並行過濾(你必須寫這個),然後連接結果。

可能有更好的方法來解決您的問題,但我們需要更多關於謂詞和列表中數據的信息。

相關問題