gpt4 book ai didi

Java 8 嵌套分组

转载 作者:塔克拉玛干 更新时间:2023-11-01 22:39:51 25 4
gpt4 key购买 nike

我有 2 个问题似乎无法解决。第一个是我需要一种方法来进行动态嵌套分组,其中可能存在用户可以传入的 1-n 嵌套组。

第二个问题是我需要在键是连续而不是嵌套的地方将结果展平。

我的示例输入如下所示:

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

这是我要实现的接口(interface):

public Map<String, List<Map<String, String>>> doGrouping(List<String> columns, 
List<Map<String, String>> data);

最佳答案

尝试以下操作:

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,这是一个 map 列表。我立即使用 Collectors.groupingBy 将流收集到列表映射中,并使用为流的每个元素计算的键。

计算 key 是棘手的部分。为此,我流式传输了给定的 列表,并将这些列中的每一列转换为流元素的相应值。我通过 Stream.map 方法完成了此操作,将 elem::map 作为映射函数传递。最后,我使用 Collectors.joining 将这个内部流收集到一个字符串中,它以高效的方式将流的每个元素连接成一个最终字符串。

编辑:如果 columns 的所有元素作为 map 元素的键存在于 data 中,则上面的代码运行良好。为了更安全,请使用以下内容:

return data.stream()
.collect(Collectors.groupingBy(
elem -> columns.stream()
.map(elem::get)
.filter(Objects::nonNull)
.collect(Collectors.joining())));

此版本从流中过滤掉 null 元素,如果某些 map 元素不包含 columns 列表中指定的键,则可能会发生这种情况。

关于Java 8 嵌套分组,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/43796825/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com