Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/algorithm/11.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 给定一个项目列表(不同类型),如何将它们分开,以便每个组只包含相同类型的项目_Java_Algorithm - Fatal编程技术网

Java 给定一个项目列表(不同类型),如何将它们分开,以便每个组只包含相同类型的项目

Java 给定一个项目列表(不同类型),如何将它们分开,以便每个组只包含相同类型的项目,java,algorithm,Java,Algorithm,给定一个不同类型项目的列表,我如何有效地将它们分开,使每组只包含相同类型的项目 更多详细信息 在java中,我有一个大约10000项的列表。共有10种不同的项目类型类型与值的属性相同。例如,List,则类型为Foo\getType() 我需要创建只包含一种项目类型的zip文件 请告诉我一些想法。代码是最受欢迎和赞赏的,甚至是伪代码。多谢各位 采纳Jon Skeet理念的公认代码 List<Foo> list = ...; ImmutableListMultimap<String

给定一个不同类型项目的
列表
,我如何有效地将它们分开,使每组只包含相同类型的项目

更多详细信息

在java中,我有一个大约10000项的
列表。共有10种不同的项目类型类型与值的属性相同。例如,
List
,则类型为
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);
}
List=。。。;
ImmutableListMultimap分组=MultiMaps.index(列表,
新函数(){
公共字符串应用(Foo输入){
返回input.getType();
}
});
对于(字符串类型:grouped.keySet()){
//下面的列表将包含相同类型的项目。
ImmutableList WidgetSameType=grouped.get(类型);
字符串zipName=getZipName(类型);
//将列表压缩到给定的文件名
Ziplit(傻瓜与SameType,zipName);
}
您可以将的
MultiMap
功能用于,因此使用
Foo.getType()
示例,如果它返回字符串:

ImmutableListMultimap<String, Foo> grouped = MultiMaps.index(list,
    new Function<Foo, String>() {
        public String apply(Foo input) {
            return input.getType();
        }
});
ImmutableListMultimap分组=MultiMaps.index(列表,
新函数(){
公共字符串应用(Foo输入){
返回input.getType();
}
});

构建从类型到该类型的一组对象的映射。迭代列表并将每个对象添加到相应的bucket中


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

Jon的回答将允许您按类型将它们排序到新的内存结构中,但是如果您只需要每种类型的zip文件,为什么不呢

Map<Type, ZipOutputStream> zips = ...;
for (Foo foo : list) {
    zips.get(foo.getType())... // add the entry and write the content
}
Map-zips=。。。;
for(Foo-Foo:list){
zips.get(foo.getType())…//添加条目并写入内容
}

在类中键入,或在“值的某些属性”中键入?@Jon:Type是值的某些属性。像
List
,那么类型是
Foo#getType()
uhmmm。。。我喜欢这个。让我写一些代码。因此,您只需通过一次列表来构建
映射zips
,然后再次通过第二次列表,将单个文件添加到正确的
ZipOutputStream
。这很聪明,没错。您甚至可以将两个过程合并为一个过程,在遇到新类型时,将新的ZO懒洋洋地添加到地图中。然后你只需穿过并在完成后关闭它们。嗨,乔恩。我已经决定实施你的解决方案,但是我还不能测试它,因为我设计的系统需要一点时间来构建。因此,我环顾四周,编写了一些代码来展示我对
ImmutableListMultimap
的理解。我把这些代码贴在我的原始问题上。乔恩,请你看一下,让我知道我的理解是否正确,好吗?多谢各位