Java - 如何根据元素的属性分离列表

问题描述:

我有一个对象的列表,我想对其执行操作。不过,我首先需要将列表划分为单独的列表,以便具有相同parentID的所有项目位于同一个列表中,然后分别对每个列表执行操作(原因是操作将对象的parentID作为参数)。Java - 如何根据元素的属性分离列表

根据这里要求的元素的给定属性来区分列表的最佳方式是什么?原始列表中要传递的最大对象数为< 10,000,通常为< 1,000。

所有帮助非常感谢!

+2

手动回路。嘿,这是Java。 – 2010-10-21 18:47:04

这听起来像你可能想要从Guava使用Multimaps.index。这将为您创建一个多图,每个图标都有一组元素。

传入indexkeyFunction将是一个Function,它只是从单个元素中检索属性。

+0

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

+0

似乎是一个很好的选择,使用Multimap。如果你关心依赖关系,那么来自hvgotcodes的代码也是一个有效且简单的选择。 – cuh 2010-10-21 19:00:10

我会推荐编写一个迭代器,它包装一个迭代器,只返回匹配你想要的元素。然后你可以编写一个Iterable的实现,它接受一个I​​terable,返回这样一个迭代器(这将允许你使用增强的for循环)。

+0

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

+0

@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,以......开头。

+0

这是没有番石榴的好选择。 – 2010-10-21 18:52:59

+0

这不是一个典型的习惯用法...你可以创建并添加列表,如果你得到空,然后添加项目。那么你只需要在一个地方添加项目而不是两个。 – ColinD 2010-10-21 19:26:05

+0

@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