Java - 如何根据元素的属性分离列表
我有一个对象的列表,我想对其执行操作。不过,我首先需要将列表划分为单独的列表,以便具有相同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