【发布时间】:2019-03-21 06:49:42
【问题描述】:
输入:我有一个 Map 列表(键 - 值对)和分组键
例如List<Map<String,String>> inputDatajson
[
{
'a': 'German',
'b': 'Audi',
'e': 'T3'
},
{
'a': 'German',
'b': 'BMW',
'c': 'T6'
},
{
'a': 'American',
'b': 'Tesla',
'c': 'T6'
}
]
和 groupingKeys= a and b
对于分组键 a -> 我将创建两个存储桶,一个用于德国和其他美国人,在每个存储桶中我将再次为 b 的值创建存储桶,检查以下内容
我想生成以下内容:Map<String, Map<String, List<Map>> - maps 的嵌套 == 分组键的数量,这里是 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)));
希望有其他想法,谢谢。我也很好奇是否可以在没有指定分组键的情况下根据给定数据派生分组。
输入是动态的,键和值由输入定义
【问题讨论】:
-
使用具体的对象!另一种方法是尝试分享您的输出类型,并查看其中驱动的复杂性。
-
您可以使用嵌套地图吗? Map
>> 其中第一个 Map 的键是国家/地区,第二个 Map 的键是公司,最后一个存储模型? -
可以,我可以根据键的性质自动派生吗,嵌套会根据分组键的数量增加,我不能假设它只是两级嵌套
-
@Naman,输入是 Map
类型,我不能对数据做出假设,创建具体类需要我指定字段名称?
标签: java hashmap java-stream grouping collectors