java - 使用 Java 流将 List<int[]> 更改为 Map<int[],int[]>

标签 java java-8 java-stream

假设我有一个

List<int[]> input = ( {1,2,3}, {1,2,4}, 
                {1,2,7}, {1,3,1}, {2,2}, 
                {1,2,8}, {1,3,4}, {2,3})

我需要把它转换成

Map<int[] , int[]> result = { [{1,2} -> {3,4,7,8}] ,
                    [{1,3} -> {1,4}] , 
                    [{2} -> {2,3}]   }

实际上,map 的键将是数组长度为 2 之前的公共(public)值,并且值应包含所有这些数组的最后一个元素。

有人可以建议我如何使用 java 流获取它吗,因为在正常循环中它是真正复杂的东西?

最佳答案

首先,将数组用作 Map 是一个非常糟糕的主意 key ,因为他们的 hashCodeequals方法基于对象标识,而不是数组内容。我建议将输入数据放入 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]}

关于java - 使用 Java 流将 List<int[]> 更改为 Map<int[],int[]>,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32044295/

相关文章:

java - 为所有用户创建文件夹

Java - BlockingQueue 卡住多线程应用程序

java-8 - 用替换方法和Java 8替换大数组中的部分字符串

Java 8 Streams - 分层排序嵌套列表

java - 如何通过流计算值

java stream sort() object to descended set of integers 失败

Java 通配符默认为 java.lang.Object 而不是上限

java - 堆大小错误 Aspose

java - Servlet 中的 @MultipartConfig 配置元素在存在 Filter 的情况下是否毫无用处?

java - 可以将其转换为单行流吗?