我有一個對象的列表,我想對其執行操作。不過,我首先需要將列表劃分爲單獨的列表,以便具有相同parentID的所有項目位於同一個列表中,然後分別對每個列表執行操作(原因是操作將對象的parentID作爲參數)。Java - 如何根據元素的屬性分離列表
根據這裏要求的元素的給定屬性來區分列表的最佳方式是什麼?原始列表中要傳遞的最大對象數爲< 10,000,通常爲< 1,000。
所有幫助非常感謝!
我有一個對象的列表,我想對其執行操作。不過,我首先需要將列表劃分爲單獨的列表,以便具有相同parentID的所有項目位於同一個列表中,然後分別對每個列表執行操作(原因是操作將對象的parentID作爲參數)。Java - 如何根據元素的屬性分離列表
根據這裏要求的元素的給定屬性來區分列表的最佳方式是什麼?原始列表中要傳遞的最大對象數爲< 10,000,通常爲< 1,000。
所有幫助非常感謝!
這聽起來像你可能想要從Guava使用Multimaps.index
。這將爲您創建一個多圖,每個圖標都有一組元素。
傳入index
的keyFunction
將是一個Function
,它只是從單個元素中檢索屬性。
總是領先一步! +1。 – 2010-10-21 18:52:01
似乎是一個很好的選擇,使用Multimap。如果你關心依賴關係,那麼來自hvgotcodes的代碼也是一個有效且簡單的選擇。 – cuh 2010-10-21 19:00:10
我會推薦編寫一個迭代器,它包裝一個迭代器,只返回匹配你想要的元素。然後你可以編寫一個Iterable的實現,它接受一個Iterable,返回這樣一個迭代器(這將允許你使用增強的for
循環)。
下降是你最終迭代相同的元素至少'm'次,其中'm'是唯一父ID的數量。 – 2010-10-21 18:54:10
@Mark True,但是如果您只想處理元素,而不是真的將其分成單獨的列表,則不會浪費空間。我不確定提問者想要什麼。 – Jonathan 2010-10-21 19:04:24
創建
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,以......開頭。
這是沒有番石榴的好選擇。 – 2010-10-21 18:52:59
這不是一個典型的習慣用法...你可以創建並添加列表,如果你得到空,然後添加項目。那麼你只需要在一個地方添加項目而不是兩個。 – ColinD 2010-10-21 19:26:05
@colinD,絕對正確;固定... – hvgotcodes 2010-10-21 19:28:07
如果您可以添加第三方庫,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
手動迴路。嘿,這是Java。 – 2010-10-21 18:47:04