gpt4 book ai didi

java - 如何使用 java-lambda 按相似键进行分组?

转载 作者:行者123 更新时间:2023-11-29 04:07:25 27 4
gpt4 key购买 nike

我有一个列表,元素的一个字段以一些相同的字符开头,我想对列表进行分组。

class Foo{
String a;
String b;
...
}

我怎样才能得到结果?

输入

List<Foo> list = Lists.newArrayList();
list.add(new Foo("FM11","1"));
list.add(new Foo("FM1122","2"));

输出

Map<String,List<String>>
{"FM11":["1","2"],"FM1122":["1","2"]}

我想使用正则表达式,如果匹配,则将 b 组合到列表中,key 使用 a。我该怎么办?

Pattern.matches(a+".*")

最佳答案

属于同一组的所有键的列表都是相同的,因此您可以通过在将它们映射到原始 A 值之前只收集每个组的一个列表来节省工作。

使用 Stream API,解决方案可能如下所示

List<Foo> list = Arrays.asList(new Foo("FM11","1"), new Foo("FM1122","2"));

Map<String,List<String>> groups = list.stream()
.collect(Collectors.groupingBy(foo -> foo.getA().substring(0, 4),
Collectors.mapping(Foo::getB, Collectors.toList())));

Map<String,List<String>> result = list.stream()
.collect(Collectors.toMap(Foo::getA, foo -> groups.get(foo.getA().substring(0, 4))));

result.forEach((k,v) -> System.out.println(k+" -> "+v));
FM1122 -> [1, 2]
FM11 -> [1, 2]

在不使用 Stream API 时,您可以更高效地执行此操作。通过循环,我们可以一次完成这两个操作,将在 map 中查找组的工作减半。

Map<String,List<String>> groups = new HashMap<>(), result = new HashMap<>();

for(Foo foo: list) {
List<String> bList
= groups.computeIfAbsent(foo.getA().substring(0, 4), x -> new ArrayList<>());
bList.add(foo.getB());
result.put(foo.getA(), bList);
}

结果是一样的。

关于java - 如何使用 java-lambda 按相似键进行分组?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/57624655/

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