首页 > 解决方案 > 将地图数据列表分组到 Java 中的嵌套 HashMap

问题描述

输入:我有一个 Map 列表(键 - 值对)和分组键

例如List<Map<String,String>> inputDatajson

[
 {
    'a': 'German',
    'b': 'Audi',
    'e': 'T3'
 },
 {
    'a': 'German',
    'b': 'BMW',
    'c': 'T6'
 },
 {
    'a': 'American',
    'b': 'Tesla',
    'c': 'T6'
 }
]

和分组键=a and b

对于分组键 a -> 我将创建两个存储桶,一个用于德国和其他美国人,在每个存储桶中我将再次为 b 的值创建存储桶,检查以下

我想产生以下内容: Map<String, Map<String, List<Map>>-地图的嵌套==分组键的数量,这里是2

{
   German: {
       Audi: [
            {
               'a': 'German',
               'b': 'Audi',
               'e': 'T3'
            }
       ],
       BMW: [
            {
               'a': 'German',
               'b': 'BMW',
               'c': 'T6'
            }
       ]
   },
   American: {
      Tesla: [
          {
            'a': 'American',
            'b': 'Tesla',
            'c': 'T6'
          }
      ]
   }
}

我尝试过的事情:

inputData.stream().collect(Collectors.groupingBy(mapItem -> this.constructGroupingKey(groupingKeys, mapItem)));

//constructGroupingKey - this joins the values of of given grouping keys

这样我可以构造连接键,例如 German-Audi OR German-BMW 并保存匹配的项目,但这不是我想要的。

正如@Naman 在这里所说的具体类 - 以下使其成为一个班轮,但我不能对数据做出假设,它的类型是 Map

Map<String, Map<String, List<ConcreteClass>>> output = inputData.stream().collect(Collectors.groupingBy(ConcreteClass::getCountry, Collectors.groupingBy(ConcreteClass::getCarType)));

将不胜感激其他想法,谢谢。我也很好奇我是否可以在没有指定分组键的情况下根据给定数据派生分组。

输入具有动态性质,键和值由输入定义

标签: javahashmapjava-streamgroupingcollectors

解决方案


只需双击作为具体类的输入表示。它看起来更简单和干净:

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;
    }
}

推荐阅读