Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/arrays/12.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
在Java8中,使用泛函从一个数组中查找一对整数,该数组的总和为给定的数字_Java_Arrays_Functional Programming_Java 8 - Fatal编程技术网

在Java8中,使用泛函从一个数组中查找一对整数,该数组的总和为给定的数字

在Java8中,使用泛函从一个数组中查找一对整数,该数组的总和为给定的数字,java,arrays,functional-programming,java-8,Java,Arrays,Functional Programming,Java 8,在Java中,我正在研究从一个数组中找到一对两个整数的问题,该数组以不同的方式求和到一个给定的数字。 我想使用Java8函数。我试过这样的方法: for (int i = 0; i < arr.length; i++) { List<Integer> res = IntStream.of(arr).boxed().filter(x -> x + arr[i] == givenNumber)

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

    for (int i = 0; i < arr.length; i++) {
        List<Integer> res = IntStream.of(arr).boxed().filter(x -> x + arr[i] == givenNumber)
                                .collect(Collectors.toList());
    }
for(int i=0;ix+arr[i]==givenNumber)
.collect(Collectors.toList());
}
但它不会工作(错误),因为“arr[i]”不是最终的,在我的方法中也不能是最终的。你可以这样说: 用arr工作中的x和y过滤(x->y->x+y==givenNumber)

那么,这可以在Java8中使用函数式编程实现吗?如果答案是肯定的,那么如何确定呢?

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

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;ix+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());
}
for(int i=0;ix==target)
.boxed().collect(collector.toList());
}

…这也清楚地表明,值得一提的是,您只需要将一个值的列表重复若干次,这可能会首先重塑您的程序。

这些被称为
互补对
,仅使用流就完全可行:

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

只需使用中间变量
inti0=i