2010-10-21 48 views
3

我有一個對象的列表,我想對其執行操作。不過,我首先需要將列表劃分爲單獨的列表,以便具有相同parentID的所有項目位於同一個列表中,然後分別對每個列表執行操作(原因是操作將對象的parentID作爲參數)。Java - 如何根據元素的屬性分離列表

根據這裏要求的元素的給定屬性來區分列表的最佳方式是什麼?原始列表中要傳遞的最大對象數爲< 10,000,通常爲< 1,000。

所有幫助非常感謝!

+2

手動迴路。嘿,這是Java。 – 2010-10-21 18:47:04

回答

6

這聽起來像你可能想要從Guava使用Multimaps.index。這將爲您創建一個多圖,每個圖標都有一組元素。

傳入indexkeyFunction將是一個Function,它只是從單個元素中檢索屬性。

+0

總是領先一步! +1。 – 2010-10-21 18:52:01

+0

似乎是一個很好的選擇,使用Multimap。如果你關心依賴關係,那麼來自hvgotcodes的代碼也是一個有效且簡單的選擇。 – cuh 2010-10-21 19:00:10

1

我會推薦編寫一個迭代器,它包裝一個迭代器,只返回匹配你想要的元素。然後你可以編寫一個Iterable的實現,它接受一個I​​terable,返回這樣一個迭代器(這將允許你使用增強的for循環)。

+0

下降是你最終迭代相同的元素至少'm'次,其中'm'是唯一父ID的數量。 – 2010-10-21 18:54:10

+0

@Mark True,但是如果您只想處理元素,而不是真的將其分成單獨的列表,則不會浪費空間。我不確定提問者想要什麼。 – Jonathan 2010-10-21 19:04:24

3

創建

Map <IdType, List<YourObject>> map 

環通的列表,併爲每個ID做類似

List theList = map.get(id); 
if (theList == null) { 
    // create a new list, add it to the map under the id 

} 

// add the item to theList 

那麼你可以循環通地圖的入口,你有對象的列表每個ID 。這種方法並不要求您知道您的列表中有多少個不同的ID,以......開頭。

+0

這是沒有番石榴的好選擇。 – 2010-10-21 18:52:59

+0

這不是一個典型的習慣用法...你可以創建並添加列表,如果你得到空,然後添加項目。那麼你只需要在一個地方添加項目而不是兩個。 – ColinD 2010-10-21 19:26:05

+0

@colinD,絕對正確;固定... – hvgotcodes 2010-10-21 19:28:07

0

如果您可以添加第三方庫,Google的Guava會提供各種可幫助您解決問題的實用工具。

具體而言,使用Collections2.transform這樣的:

Collection myOriginalList; 
Collection mySplitList1 = Collections2.transform(myOriginalList, new Function() { /* method to filter out parent ID 1 */ }); 
... // repeat for each parent id you're interested in 
相關問題