我有两个似乎解决不了的问题。第一个问题是,我需要一种方法,通过用户可以传入的1n个嵌套组来进行动态嵌套分组。
第二个问题是,我需要将结果平缓到键连接的地方,而不是嵌套的地方。
我的示例输入如下所示:
List<Map<String, String>> fakeData = new LinkedList<>();
Map<String, String> data1 = new HashMap<>();
data1.put("ip","10.0.1.0");
data1.put("uid","root");
data1.put("group","admin");
fakeData.add(data1);
Map<String, String> data2 = new HashMap<>();
data2.put("ip","10.0.1.1");
data2.put("uid","tiger");
data2.put("group","user");
fakeData.add(data2);
Map<String, String> data3 = new HashMap<>();
data3.put("ip","10.0.1.1");
data3.put("uid","woods");
data3.put("group","user");
fakeData.add(data3);
最终结果包含一个映射键:
{
"10.0.1.1user": [
{
"uid": "tiger",
"ip": "10.0.1.1",
"group": "user"
},
{
"uid": "woods",
"ip": "10.0.1.1",
"group": "user"
}
],
"10.0.1.0admin": [
"uid": "root",
"ip": "10.0.1.0",
"group": "admin"
]
}
注意,这些键是连接的,而不是映射中的嵌套映射。
我正在尝试创建一个群,在那里它可以是动态的,而不需要任何运气:
fakeData.stream()
.collect(groupingBy(map -> map.get("ip"),
groupingBy(map -> map.get("uuid"),
... nested "n" times)));
这是我试图实现的接口:
public Map<String, List<Map<String, String>>> doGrouping(List<String> columns,
List<Map<String, String>> data);
发布于 2017-05-05 06:12:34
尝试以下几点:
public Map<String, List<Map<String, String>>> doGrouping(
List<String> columns,
List<Map<String, String>> data) {
return data.stream()
.collect(Collectors.groupingBy(
elem -> columns.stream()
.map(elem::get)
.collect(Collectors.joining())));
}
首先,我对data
进行了流,这是一个地图列表。我立即使用Collectors.groupingBy
将流收集到一个列表映射中,并使用为流的每个元素计算的键。
计算钥匙是最棘手的部分。为此,我流进了给定的columns
列表,并将其中的每一列转换为流元素的对应值。我通过Stream.map
方法完成了这个任务,并将elem::map
作为映射函数传递。最后,我使用Collectors.joining
将这个内部流收集到一个字符串中,该字符串以一种高效的方式将流的每个元素连接成一个最终的字符串。
编辑:如果columns
的所有元素都作为data
中映射元素的键存在,那么上面的代码工作得很好。为了更安全起见,请使用以下内容:
return data.stream()
.collect(Collectors.groupingBy(
elem -> columns.stream()
.map(elem::get)
.filter(Objects::nonNull)
.collect(Collectors.joining())));
此版本从流中筛选出null
元素,如果某些map元素不包含在columns
列表中指定的键,则可能会发生这种情况。
发布于 2017-05-05 05:46:21
不确定是否使用流,但如果您更喜欢简单的java方式,则要容易得多。如果我正确理解你的问题,这里是你想要构建的方法。你可能需要稍微调整一下,以使它更快。
public Map<String, List<Map<String, String>>> doGrouping(List<String> columns, List<Map<String, String>> data) {
Map<String, List<Map<String, String>>> output = new HashMap<>();
for (Map<String, String> map : data) {
String key = "";
for(String column : columns) key += "".equals(key) ? (map.get(column)) : (":" + map.get(column));
output.computeIfAbsent(key, k -> Arrays.asList(map));
}
return output;
}
测试:
doGrouping(Arrays.asList("ip", "group"), fakeData)
>> {10.0.1.1:user=[{uid=tiger, ip=10.0.1.1, group=user}, {uid=woods, ip=10.0.1.1, group=user}], 10.0.1.0:admin=[{uid=root, ip=10.0.1.0, group=admin}]}
doGrouping(Arrays.asList("group"), fakeData)
>> {admin=[{uid=root, ip=10.0.1.0, group=admin}], user=[{uid=tiger, ip=10.0.1.1, group=user}, {uid=woods, ip=10.0.1.1, group=user}]}
https://stackoverflow.com/questions/43796825
复制相似问题