这是一个对象调用Mon。它有两个属性,开始和结束,都是字符串。
末尾attr可以包含“;”像这样

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


现在,我想按开始attr和结束attr对列表进行分组,但是基于末尾包含“;”,所以我也想将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(), ....);
});


祝您好运,但坦率地说,这是一个怪异的实现,您想在其中应用Map键中匹配的char。不确定您要达到的目标。

09-30 15:07
查看更多