gpt4 book ai didi

java - 如何使用jdk8对ArrayList进行分组和过滤
转载 作者:行者123 更新时间:2023-12-02 09:21:43 25 4
gpt4 key购买 nike

这是一个对象调用 Mon。它有两个属性,start 和 end,都是 String。结束属性可以包含“;”像这样

Mon m1 = new Mon(); m1.setStart("A"); m1.setEnd("a;b");
Mon m2 = new Mon(); m2.setStart("A"); m2.setEnd("b");
Mon m3 = new Mon(); m3.setStart("C"); m3.setEnd("c");
Mon m4 = new Mon(); m4.setStart("A"); m4.setEnd("c");

这是一个 ArrayList。

List<Mon> list = new ArrayList();
list.add(m1);list.add(m2);list.add(m3);list.add(m4);

现在我想按开始属性和结束属性对列表进行分组,但基于结尾包含“;”,所以我也想将 m1 和 m2 放入同一组,因为 m1.end 包含m2.end,但是m4在另一个组中,因为m4的开始和结束与m1,m2不同。

我尝试使用 Collectors.groupingBy 按开始进行分组

Map<String, List<Mon>> map = list.stream().collect(Collectors.groupingBy(d -> d.getStart()));

但这不是我想要的结果输出如下:

key: Aa;b OR Ab , value: m1, m2
key: Cc, value: m3
key: Ac, value: m4

有什么办法实现吗,还有jdk8的流功能比较好

非常感谢

最佳答案

以下应该为您提供预期的结果..

Mon m1 = new Mon(); m1.setStart("A"); m1.setEnd("a;b");
Mon m2 = new Mon(); m2.setStart("A"); m2.setEnd("b");
Mon m3 = new Mon(); m3.setStart("C"); m3.setEnd("c");

List<Mon> list = new ArrayList();
list.add(m1);list.add(m2);list.add(m3);

Function<Mon, String> compositeKey = mon -> mon.getStart()+mon.getEnd();

Map<String, List<Mon>> resultMap = list.stream().collect(Collectors.groupingBy(compositeKey,Collectors.toList()));

注意:对于键中的字符级别匹配,您必须在 list.stream().forEach(){ mon ->.... 中编写 lambda 表达式。我不认为复杂的需求不能通过 OOB 函数来解决。甚至 Hashmap 函数也是基于精确的键匹配。如果我看到你的预期结果,那甚至不是包含匹配 key: Aa;b OR Ab

final Map<String, List<Mon>> resultMap = new HashMap();
list.stream().forEach(mon -> {
resultMap.put(mon.getStart()+getEnd(), ....);
});

祝你好运,但坦率地说,这是一个奇怪的实现,您希望在映射键中应用匹配的字符。不确定您想用它实现什么目标。

关于java - 如何使用jdk8对ArrayList<Object>进行分组和过滤,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/58653781/

25 4 0