在 Java 8 中使用泛函从数组中查找总和为给定数字的一对整数

问题描述 投票:0回答:3

我正在研究以不同的方式从数组中找到一对两个整数的问题,该数组的总和为 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 == GiveNumber) 与 arr 中的 x 和 y 以某种方式工作?

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

java arrays functional-programming java-8
3个回答
4
投票

可以将它们定为最终的。如果没有别的事,你可以写

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

0
投票
    Set<String> set = new LinkedHashSet<>();
    for (int i = 0; i < array.length - 1; i++) {
        final int pos = i;
        Arrays.stream(array).skip(pos + 1).filter(element -> array[pos] + element == sumTarget).forEach(element -> {
            set.add("{" + array[pos] + ", " + element + "}");
        });
    }
    set.forEach(System.out::println);
© www.soinside.com 2019 - 2024. All rights reserved.