【问题标题】:Find a pair of integers from an array that sums up to a given number in Java 8 using functionals在 Java 8 中使用函数从数组中找到一对整数,该数组总和为给定数字
【发布时间】:2017-10-04 07:12:36
【问题描述】:

我正在研究从一个数组中找到一对两个整数的问题,该数组以不同的方式在 Java 中求和为给定的数字。 我想使用 Java 8 函数。我尝试过这样的事情:

    for (int i = 0; i < arr.length; i++) {
        List<Integer> res = IntStream.of(arr).boxed().filter(x -> x + arr[i] == givenNumber)
                                .collect(Collectors.toList());
    }

但它不起作用(错误),因为“arr[i]”不是最终的,在我的方法中也不能是最终的。可以像: filter(x -> y -> x + y == givenNumber) 与 arr 中的 x 和 y 以某种方式工作?

那么这可以在 Java 8 中使用函数式编程来完成吗?如果答案是肯定的,那怎么做?

【问题讨论】:

  • 只使用一个中间变量int i0 = i;

标签: java arrays functional-programming java-8


【解决方案1】:

可以把它们做成最终的。如果没有别的,你可以写

for (int i = 0; i < arr.length; i++) {
    final int[] arrFinal = arr;
    final int iFinal = i;
    List<Integer> res = IntStream.of(arr).boxed()
        .filter(x -> x + arrFinal[iFinal] == givenNumber)
        .collect(Collectors.toList());
}

虽然我会把它写成

for (int i = 0; i < arr.length; i++) {
    int target = givenNumber - arr[i];
    List<Integer> res = IntStream.of(arr).filter(x -> x == target)
                           .boxed().collect(Collectors.toList());
}

...这也清楚地表明,对于它的价值,您将拥有一个重复若干次的单个值列表,这可能会首先重塑您的程序。

【讨论】:

    【解决方案2】:

    这些被称为complementary pairs,仅使用流就完全可行:

     private static void showPairs(int k, int[] array) {
    
        IntStream.range(0, array.length)
                .boxed()
                .flatMap(i -> IntStream.range(i, array.length)
                        .boxed()
                        .filter(j -> k - array[i] == array[j])
                        .flatMap(j -> Stream.of(new int[] { i, j }, new int[] { j, i }))) // [i, j] and [j, i]
                .forEach(arr -> System.out.println(Arrays.toString(arr)));
    }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2011-10-07
      • 2017-07-07
      • 2020-02-22
      • 1970-01-01
      • 1970-01-01
      • 2018-09-10
      • 2019-04-26
      相关资源
      最近更新 更多