Java I';我用不同的方法实现了相同的函数,有人能告诉我为什么我的上一个函数没有';不要打印错误? publicstaticvoidmain(字符串[]args){ System.out.println(hasPairWithSum(新的int[]{12,4,3,4,1,7},9)); System.out.println(hasPairWithSum2(新的int[]{12,4,3,4,1,7},9)); System.out.println(hasPairWithSum3(新的int[]{12,4,3,4,1,7},9)); } 公共静态布尔hasPairWithSum(int[]intArray,int sum){ int len=intArray.length; 对于(int i=0;i{ if(mySet.contains(intArray[i])){ add(newint[]{intArray[i],sum-intArray[i]}); } mySet.add(sum-intArray[i]); }); return!resultingPairs.isEmpty(); } 可能是因为(false!=null)==trueOk,有什么建议可以解决这个问题吗?@CristianMateica我们甚至不知道你的代码应该做什么。您的上一个方法似乎与前两个方法的逻辑不同,因此为什么它会产生相同的结果?请删除!=上一行中的null有一些值得争论和思考的问题return IntStream.range(0,intArray.length).filter(i->mySet.add(intArray[i]).anyMatch(i->!mySet.addAll(新HashSet(Arrays.asList(sum-intArray[i],intArray[i]))谢谢你的解释,它们真的很有帮助。 public static boolean hasPairWithSum3(int[] intArray, int sum) { HashSet<Integer> mySet = new HashSet<Integer>(); 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; }); } public static boolean hasPairWithSum3(int[] intArray, int sum) { HashSet<Integer> mySet = new HashSet<>(); int len = intArray.length; List<int[]> resultingPairs = new ArrayList<>(); IntStream.range(0, len).forEach(i -> { if (mySet.contains(intArray[i])) { resultingPairs.add(new int[]{intArray[i], sum - intArray[i]}); } mySet.add(sum - intArray[i]); }); return !resultingPairs.isEmpty(); }

Java I';我用不同的方法实现了相同的函数,有人能告诉我为什么我的上一个函数没有';不要打印错误? publicstaticvoidmain(字符串[]args){ System.out.println(hasPairWithSum(新的int[]{12,4,3,4,1,7},9)); System.out.println(hasPairWithSum2(新的int[]{12,4,3,4,1,7},9)); System.out.println(hasPairWithSum3(新的int[]{12,4,3,4,1,7},9)); } 公共静态布尔hasPairWithSum(int[]intArray,int sum){ int len=intArray.length; 对于(int i=0;i{ if(mySet.contains(intArray[i])){ add(newint[]{intArray[i],sum-intArray[i]}); } mySet.add(sum-intArray[i]); }); return!resultingPairs.isEmpty(); } 可能是因为(false!=null)==trueOk,有什么建议可以解决这个问题吗?@CristianMateica我们甚至不知道你的代码应该做什么。您的上一个方法似乎与前两个方法的逻辑不同,因此为什么它会产生相同的结果?请删除!=上一行中的null有一些值得争论和思考的问题return IntStream.range(0,intArray.length).filter(i->mySet.add(intArray[i]).anyMatch(i->!mySet.addAll(新HashSet(Arrays.asList(sum-intArray[i],intArray[i]))谢谢你的解释,它们真的很有帮助。 public static boolean hasPairWithSum3(int[] intArray, int sum) { HashSet<Integer> mySet = new HashSet<Integer>(); 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; }); } public static boolean hasPairWithSum3(int[] intArray, int sum) { HashSet<Integer> mySet = new HashSet<>(); int len = intArray.length; List<int[]> resultingPairs = new ArrayList<>(); IntStream.range(0, len).forEach(i -> { if (mySet.contains(intArray[i])) { resultingPairs.add(new int[]{intArray[i], sum - intArray[i]}); } mySet.add(sum - intArray[i]); }); return !resultingPairs.isEmpty(); },java,lambda,java-stream,Java,Lambda,Java Stream,流在Java中是惰性的。您需要调用一个终端操作来开始计算流 “StreammapToObj(IntFunctionmapper)”不是一个终端操作,它总是返回Stream对象,并且总是不为null 您可以这样修改代码,但我不确定这是否是使用流的良好实践: public static void main(String[] args) { System.out.println(hasPairWithSum(new int[] { 12, 4, 3, 4, 1, 7 }, 9))

流在Java中是惰性的。您需要调用一个终端操作来开始计算流

StreammapToObj(IntFunction<?extends U>mapper)”不是一个终端操作,它总是返回Stream对象,并且总是不为null

您可以这样修改代码,但我不确定这是否是使用流的良好实践:

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 < len - 1; i++) {
        for (int j = i + 1; j < len; j++) {
                if (intArray[i] + intArray[j] == sum) {
                    return true;
                }
        }
  }         
  return false;
}

public static boolean hasPairWithSum2(int[] intArray, int sum) {         
    HashSet<Integer> mySet = new HashSet<Integer>();
    int len = intArray.length;
    for (int i = 0; i < len; i++) {
        if (mySet.contains(intArray[i])) {
                return true;
        }
        mySet.add(sum - intArray[i]);
    }
    return false;
}

public static boolean hasPairWithSum3(int[] intArray, int sum) {         
    HashSet<Integer> mySet = new HashSet<Integer>();
    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;
}
public静态布尔hasPairWithSum3(int[]intArray,int sum){
HashSet mySet=新HashSet();
int len=intArray.length;
返回IntStream.range(0,len).anyMatch(i->{
if(mySet.contains(intArray[i])){
返回true;
}
mySet.add(sum-intArray[i]);
返回false;
});
}

首先,应将
mapToObj
函数替换为
forEach
。然后,我只需将匹配对添加到数组列表(对),最后,验证该列表是否为空

以下是您的问题的解决方案,灵感来自:

public静态布尔hasPairWithSum3(int[]intArray,int sum){
HashSet mySet=新HashSet();
int len=intArray.length;
List resultingPairs=新建ArrayList();
IntStream.range(0,len).forEach(i->{
if(mySet.contains(intArray[i])){
add(newint[]{intArray[i],sum-intArray[i]});
}
mySet.add(sum-intArray[i]);
});
return!resultingPairs.isEmpty();
}

可能是因为(false!=null)==trueOk,有什么建议可以解决这个问题吗?@CristianMateica我们甚至不知道你的代码应该做什么。您的上一个方法似乎与前两个方法的逻辑不同,因此为什么它会产生相同的结果?请删除!=上一行中的null有一些值得争论和思考的问题
return IntStream.range(0,intArray.length).filter(i->mySet.add(intArray[i]).anyMatch(i->!mySet.addAll(新HashSet(Arrays.asList(sum-intArray[i],intArray[i]))谢谢你的解释,它们真的很有帮助。
public static boolean hasPairWithSum3(int[] intArray, int sum) {         
    HashSet<Integer> mySet = new HashSet<Integer>();
    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;
    });
}
public static boolean hasPairWithSum3(int[] intArray, int sum) {
    HashSet<Integer> mySet = new HashSet<>();
    int len = intArray.length;
    List<int[]> resultingPairs = new ArrayList<>();

    IntStream.range(0, len).forEach(i -> {
        if (mySet.contains(intArray[i])) {
            resultingPairs.add(new int[]{intArray[i], sum - intArray[i]});
        }

        mySet.add(sum - intArray[i]);
    });

    return !resultingPairs.isEmpty();
}