2010-11-18 33 views
3

我有一個對象列表,如銷售。我只需要銷售對象的產品與另一個列表中的產品匹配,比如說saleProductList。java篩選對象列表的最佳方法

除了循環,有沒有更好的方法來做到這一點。

回答

13

如果您已經在使用Google的Guava圖書館,它有一個Collections2.filter()方法,該方法將只返回與給定的Predicate匹配的集合中的那些項目。

但是,這是否回答您的問題取決於您的動機是爲了避免循環。由於Java集合沒有內置此功能,因此只能以某種級別遍歷所有元素。 Guava在內部執行此操作,但它仍然在執行與手動操作相同的循環,只是穿着更好的API。

1

您可以使用Apache公共庫中的Collections方法。然而這些方法只是爲你做循環。當你試圖做你需要的東西時,你無法避免它。

1

這些功能類似於替代品,它使您的代碼變得簡單易懂,但它們在內部可能需要遍歷列表。但是如果有機會,客戶端可能並不總是使用這種方法,他們會懶惰執行過濾。

檢查過濾器(...)方法適合你:Iterables.filter(Iterable, Predicate)

+0

我修復並格式化(斷開)鏈接。Javadoc方法鏈接包含需要轉義的字符。此外,Google Collections現在是Guava的一部分。 – 2010-11-18 14:45:44

0

在一定程度上,循環將不可避免地被捲入。

如果兩個數據結構都是列表,那麼成本將與2個列表長度的PRODUCT成比例。如果名單很大,這可能非常昂貴。

爲了避免這種情況,需要使用某種數據結構來表示其中的一個或兩個列表,這些數據結構的查找速度比簡單列表快。

0

使用谷歌的collections libray

List result1 = Lists.newArrayList(Collections2.filter(originalList,filterPredicate)); 
List result2 = Lists.newLinkedList(Collections2.filter(originalList,filterPredicate)); 

雖然這些給你做一個適當的名單,他們立即招致存儲開銷和迭代時間開銷。如果你寧願推遲那(「懶」的評價),你可以使用一個可迭代或迭代器串行訪問:

Iterable result3 = Iterables.filter(originalList,filterPredicate)); // Pangea's solution 
Iterator result4 = Iterators.filter(originalList.iterator(),filterPredicate)); 

(我離開類型參數作爲練習讀者。)

相關問題