在Java8中,使用泛函从一个数组中查找一对整数,该数组的总和为给定的数字
在Java中,我正在研究从一个数组中找到一对两个整数的问题,该数组以不同的方式求和到一个给定的数字。 我想使用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)
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代码>