给定项目列表(不同类型),如何将这些项目分开,以便每个组仅包含具有相同类型的项目

时间:2011-08-17 19:49:48

标签: java algorithm

鉴于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);
}

3 个答案:

答案 0 :(得分:2)

您可以将GuavaMultiMap功能与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)

从类型构建地图到该类型的一组对象。迭代列表并将每个对象添加到相应的存储桶中。

如果您想要一个使用较少内存的解决方案,您可以按类型对列表进行排序,以便将对象分组为包含相同类型项目的块。