Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/385.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中的嵌套HashMap中_Java_Hashmap_Java Stream_Grouping_Collectors - Fatal编程技术网

将映射数据列表分组到Java中的嵌套HashMap中

将映射数据列表分组到Java中的嵌套HashMap中,java,hashmap,java-stream,grouping,collectors,Java,Hashmap,Java Stream,Grouping,Collectors,输入:我有一个映射键值对和分组键的列表 e、 g.列出输入数据json 和分组键=a和b 对于分组键a->我将创建两个bucket,一个用于德国,另一个用于美国,在每个bucket中,我将再次为值b创建bucket,检查以下内容 我想生成以下内容:Map只是双击输入作为具体类的表示。它看起来更简单、更干净,如下所示: Map<String, Map<String, List<ThrowAway>>> multipleGrouping(List<Throw

输入:我有一个映射键值对和分组键的列表

e、 g.列出输入数据json

和分组键=a和b

对于分组键a->我将创建两个bucket,一个用于德国,另一个用于美国,在每个bucket中,我将再次为值b创建bucket,检查以下内容


我想生成以下内容:Map只是双击输入作为具体类的表示。它看起来更简单、更干净,如下所示:

Map<String, Map<String, List<ThrowAway>>> multipleGrouping(List<ThrowAway> inputData) {
    return inputData.stream()
            .collect(Collectors.groupingBy(ThrowAway::getA,
                    Collectors.groupingBy(ThrowAway::getB)));
}

由于您正在寻找动态解决方案,以下是另一种方法:

可以使用以下分组方法为传递两个键:

public Map<String, Map<String, List<Map<String, String>>>> group(List<Map<String, String>> list, String key1, String key2) {
    return list.stream().collect(
            Collectors.groupingBy(m -> m.get(key1),
                    Collectors.groupingBy(m -> m.get(key2))
            )
    );
}
使用以下选项调用其中一个方法:

Map<String, Map<String, List<Map<String, String>>>> result = group(list, "a", "b");


使用具体的物体!另一种方法是,试着分享你的输出类型,看看那里驱动的复杂性。你能使用嵌套映射吗?第一张地图的关键是一个国家,第二张地图是一家公司,最后一张地图存储模型?是的,我可以,我可以根据关键点的性质自动导出它吗?嵌套将根据分组关键点的数量增加,我不能假设它只是两个级别的模型nesting@Naman,输入类型为Map,我不能对数据做出假设,创建具体的类需要我指定字段名?糟糕的命名约定!同意,但这里更多的是描述方法。你是说从给定的Map->derivate-class-ThrowAway输入?输入将发生变化,我们不能将所有内容都映射到一次性使用?@Pradeep我试图传达的是,根据问题本身,假设存在某些保证。例如,是否有可能以[{'a':'德语','b':'奥迪','e':'T3'},{'a':'德语','b':'宝马','c':'T6'},{'d':'美国','e':'特斯拉','f':'T6'}的形式输入,然后您希望输出是什么?必须有某种契约来确定要分组的密钥。我们不能采用输入形式,但我可以要求调用方预先注册分组密钥,输出总是基于分组嵌套的keys@Pradeep在我的理解中,预注册密钥是定义一个具体的对象。而且,您似乎忽略了继承在这里可以扮演的角色。
Map<String, Map<String, List<ThrowAway>>> multipleGrouping(List<ThrowAway> inputData) {
    return inputData.stream()
            .collect(Collectors.groupingBy(ThrowAway::getA,
                    Collectors.groupingBy(ThrowAway::getB)));
}
class ThrowAway {
    String a;
    String b;
    String c;

    String getA() {
        return a;
    }

    String getB() {
        return b;
    }
}
public Map<String, Map<String, List<Map<String, String>>>> group(List<Map<String, String>> list, String key1, String key2) {
    return list.stream().collect(
            Collectors.groupingBy(m -> m.get(key1),
                    Collectors.groupingBy(m -> m.get(key2))
            )
    );
}
public Map<String, Map<String, List<Map<String, String>>>> group(List<Map<String, String>> list, String key1, String key2, String noneKey) {
    return list.stream().collect(
            Collectors.groupingBy(m -> m.getOrDefault(key1, noneKey),
                    Collectors.groupingBy(m -> m.getOrDefault(key2, noneKey))
            )
    );
}
Map<String, Map<String, List<Map<String, String>>>> result = group(list, "a", "b");
Map<String, Map<String, List<Map<String, String>>>> result = group(list, "a", "b", "none");