Я реализовал одну и ту же функцию с разными подходами, кто-нибудь может сказать мне, почему моя последняя функция не печатает false? - PullRequest
2 голосов
/ 26 февраля 2020
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;
}

Ответы [ 2 ]

6 голосов
/ 26 февраля 2020

Потоки ленивы в Java. Вам нужно вызвать терминальную операцию для начала оценки потока

" Stream mapToObj (IntFunction <? Extends U> mapper)" не является терминальной операцией и всегда возвращает Stream объект, и он всегда не равен нулю.

Вы можете изменить свой код следующим образом, но я не уверен, что это хорошая практика для использования потоков:

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;
    });
}
2 голосов
/ 26 февраля 2020

Во-первых, вы должны заменить функцию mapToObj на forEach. Затем я просто добавил бы соответствующие пары в список массивов (пар) и, наконец, проверил, является ли этот список пустым.

Вот решение вашей проблемы, вдохновленное https://www.baeldung.com/java-algorithm-number-pairs-sum:

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