我已经用不同的方法实现了相同的功能,有人可以告诉我为什么我的最后一个功能不会打印错误吗?
来源:爱站网时间:2021-09-16编辑:网友分享
public static void main(String [] args){System.out.println(hasPairWithSum(new int [] {12,4,3,4,1,7},9)); System.out.println(hasPairWithSum2(new int [] {12,4,3,4,1,7},...
问题描述
public static void main(String[] args) {
System.out.println(hasPairWithSum(new int[] { 12, 4, 3, 4, 1, 7 }, 9));
System.out.println(hasPairWithSum2(new int[] { 12, 4, 3, 4, 1, 7 }, 9));
System.out.println(hasPairWithSum3(new int[] { 12, 4, 3, 4, 1, 7 }, 9));
}
public static boolean hasPairWithSum(int[] intArray, int sum) {
int len = intArray.length;
for (int i = 0; i mySet = new HashSet();
int len = intArray.length;
for (int i = 0; i mySet = new HashSet();
int len = intArray.length;
return IntStream.range(0, len).mapToObj(i -> {
if (mySet.contains(intArray[i])) {
return true;
}
mySet.add(sum - intArray[i]);
return false;
}) != null;
}
思路一:
首先,应将mapToObj
功能替换为forEach
。然后,我将匹配的对添加到数组列表(对)。
这里是您的问题的解决方案,灵感来自https://www.baeldung.com/java-algorithm-number-pairs-sum:
public static boolean hasPairWithSum3(int[] intArray, int sum) {
Map pairs = new HashMap();
List resultingPairs = new ArrayList();
IntStream.range(0, intArray.length).forEach(i -> {
if (pairs.containsKey(intArray[i])) {
if (pairs.get(intArray[i]) != null) {
resultingPairs.add(new int[]{intArray[i], sum - intArray[i]});
}
pairs.put(sum - intArray[i], null);
} else if (!pairs.containsValue(intArray[i])) {
pairs.put(sum - intArray[i], intArray[i]);
}
});
return !resultingPairs.isEmpty();
}
思路二:
流在Java中是惰性的。您需要校准终止函数才能开始评估流
“ Stream mapToObj(IntFunction mapper)”是终止的函数,它始终返回Stream对象,并且它始终不为null。
您可以像这样修改您的代码,但是我不确定使用流是一种好习惯:
public static boolean hasPairWithSum3(int[] intArray, int sum) {
HashSet mySet = new HashSet();
int len = intArray.length;
return IntStream.range(0, len).anyMatch(i -> {
if (mySet.contains(intArray[i])) {
return true;
}
mySet.add(sum - intArray[i]);
return false;
});
}
上一篇:等待x毫秒或直到条件变为真