【问题标题】:How to combine multiple Lists in Java based on a condition using the Stream API?如何使用 Stream API 根据条件组合 Java 中的多个列表?
【发布时间】:2023-01-11 10:38:35
【问题描述】:

假设我有 4 个大小相同的列表 (N):

A = [22, -1, -10]
B = [3, -2, 54]
C = [-12, 3, 2]
D = [40, 4, -3]

我想根据条件从每个索引的每个列表中选择一个数字,将它们组合到另一个大小为 N 的列表中。 假设我们取最小的正整数,以保持简单。

结果看起来像这样:

Result = [3, 3, 2]

使用 Java 流 API 执行此操作的最优雅方法是什么?

【问题讨论】:

  • 我从每个索引的所有列表中选择了最小的正整数。在索引 0 处它是 3,在索引 1 处它是 3,在索引 2 处它是 2 等等。优雅高效,不会创建太多临时列表和 for 循环

标签: java spring java-stream


【解决方案1】:

我对您的示例结果感到困惑,因为它与您的问题不符。
你说结果应该是大小 N = 4,但你的例子是大小 3。你说通过从每个列表中选择一个数字来构建结果,然后你从列表 C (3, 2) 中选择了 2 个数字。

我已经给出了两种解决方案,因为我不知道你想要哪一种。

public static void main(String[]args) {
        List<Integer> A = Arrays.asList(22, -1, -10);
        List<Integer> B = Arrays.asList(3, -2, 54);
        List<Integer> C = Arrays.asList(-12, 3, 2);
        List<Integer> D = Arrays.asList(40, 4, -3);
        
        List<List<Integer>> listOfLists = Arrays.asList(A, B, C ,D);
        
        // get the min positive integers by picking one from each lsit
        List<Integer> positiveMinsPickOne = listOfLists.stream()
                .map((list -> list.stream().filter(num -> num >= 0).min(Integer::compareTo).get()))
                .collect(Collectors.toList());
        
        System.out.println(positiveMinsPickOne);
        
        // get the min positive integers by picking over all integers
        List<Integer> positiveMinsPickAll = listOfLists.stream()
        .flatMap(List::stream)
        .filter(num -> num > 0)
        .sorted()
        .limit(listOfLists.size())
        .collect(Collectors.toList());
        
        System.out.println(positiveMinsPickAll);
    }

输出:
[22, 3, 2, 4]
[2, 3, 3, 4]

【讨论】:

    【解决方案2】:

    下面是一个采用矩阵和函数来减少每一列并将结果作为数组返回的方法:

    int[] aggregate(List<List<Integer>> lists, ToIntFunction<IntStream> function) {
        return IntStream.range(0, lists.get(0).size())
                .mapToObj(col -> lists.stream().mapToInt(list -> list.get(col)))
                .mapToInt(function)
                .toArray();
    }
    

    您可以这样调用它以获得每列的最低正值:

    aggregate(Arrays.asList(a, b, c, d), col -> col.filter(i -> i > 0).min().orElse(0))
    

    【讨论】:

      猜你喜欢
      • 2017-12-13
      • 2016-07-01
      • 2020-08-26
      • 2020-12-02
      • 2021-07-25
      • 2021-11-29
      • 2023-02-10
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多