鉴于List
个不同类型的项目,我如何有效分隔这些项目,因此每个组只包含相同类型的项目?
More details
在java中,我有一个大约10000个项目的List
。项目有10种不同的类型。 键入作为值的属性。例如,List<Foo>
,则输入Foo#getType()
。
我需要创建仅包含一种类型项目的zip文件。
请给我一些想法。代码是最受欢迎和赞赏的,甚至是伪代码。谢谢。
接受代码从Jon Skeet获取想法
List<Foo> list = ...;
ImmutableListMultimap<String, Foo> grouped = MultiMaps.index(list,
new Function<Foo, String>() {
public String apply(Foo input) {
return input.getType();
}
});
for(String type : grouped.keySet()){
//The below list will contains items with the same type.
ImmutableList<Foo> fooListWithSameType = grouped.get(type);
String zipName = getZipName(type);
//Zip the list to a given file name
zipList(fooListWithSameType, zipName);
}
答案 0 :(得分:2)
您可以将Guava的MultiMap
功能与MultiMaps.index
一起使用,因此使用Foo.getType()
示例,如果它返回一个字符串:
ImmutableListMultimap<String, Foo> grouped = MultiMaps.index(list,
new Function<Foo, String>() {
public String apply(Foo input) {
return input.getType();
}
});
答案 1 :(得分:1)
Jon的答案将允许您按类型将它们排序为新的内存中结构,但如果您只需要每种类型的zip文件,为什么不呢
Map<Type, ZipOutputStream> zips = ...;
for (Foo foo : list) {
zips.get(foo.getType())... // add the entry and write the content
}
答案 2 :(得分:0)
从类型构建地图到该类型的一组对象。迭代列表并将每个对象添加到相应的存储桶中。
如果您想要一个使用较少内存的解决方案,您可以按类型对列表进行排序,以便将对象分组为包含相同类型项目的块。