假设我有
{{1}}
我需要将其转换为
{{1}}
有效地,map的关键是常数值,直到数组长度为2,值应该包含所有这些数组的最后一个元素。
有人可以建议我如何使用java流来获取它,因为在正常的循环中,所有这些都是非常复杂的事情吗?
答案 0 :(得分:7)
首先,将数组用作Map
密钥是一个非常糟糕的主意,因为它们的hashCode
和equals
方法基于对象标识,而不是基于数组内容。我建议将输入数据改为List<List<Integer>>
:
List<List<Integer>> lists = Arrays.asList(Arrays.asList(1,2,3), Arrays.asList(1,2,4),
Arrays.asList(1,2,7),Arrays.asList(1,3,1),Arrays.asList(2,2),
Arrays.asList(1,2,8),Arrays.asList(1,3,4),Arrays.asList(2,3));
使用级联groupingBy
:
Map<List<Integer>, List<Integer>> result = lists.stream().collect(
Collectors.groupingBy(list -> list.subList(0, list.size() - 1),
Collectors.mapping(list -> list.get(list.size() - 1),
Collectors.toList())));
元素按列表前缀(除最后一个之外的所有元素)进行分类,然后在下游缩减期间,最后一个列表元素被提取并收集到列表中。
结果:
System.out.println(result);
{[2]=[2, 3], [1, 2]=[3, 4, 7, 8], [1, 3]=[1, 4]}