我正在研究以不同的方式从数组中找到一对两个整数的问题,该数组的总和为 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 中使用函数式编程来完成吗?如果答案是肯定的,那么如何?
你可以将它们定为最终的。如果没有别的事,你可以写
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());
}
...这也清楚地表明,无论它的价值如何,您都会有一个重复多次的单个值的列表,这可能首先会重塑您的程序。
这些称为
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)));
}
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);