Поиск целого числа в arraylist в java

public class FindNumber {

            static String findNumber(List<Integer> arr, int k) {
                String res = "YES";
    //Unable to identify problem with this part of the code
                for (int i = 0; i < arr.size(); i++) {
                    if (k == arr.get(i))
                        res = "YES";
                    else
                        res = "NO";

                }

                return res;

            }
}

Приведенный выше код возвращает НЕТ в качестве ответа, даже если целое число присутствует в списке.

Использование == для сравнения целочисленных объектов работает только в том случае, если значения находятся между -128 и 127, все остальные значения необходимо сравнивать с использованием метода .equals().

JonK 18.07.2019 11:20

в вашем коде есть несколько ошибок. Если вы хотите true или false, верните логическое значение (например)

Stultuske 18.07.2019 11:24

@JonK нет сравнения между объектами Integer. Сравнение проводится между объектом Integer и примитивом int. В этом случае целочисленный объект автоматически распаковывается.

THe_strOX 18.07.2019 11:25

@THe_strOX Абсолютно верно, поэтому это комментарий, а не ответ. Это довольно легко укусить, когда вы только начинаете, поэтому я считаю, что об этом все же стоит упомянуть.

JonK 18.07.2019 11:28

@JonK Это имеет смысл.

THe_strOX 18.07.2019 11:29
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
Как вычислять биты и понимать побитовые операторы в Java - объяснение с примерами
Как вычислять биты и понимать побитовые операторы в Java - объяснение с примерами
В компьютерном программировании биты играют важнейшую роль в представлении и манипулировании данными на двоичном уровне. Побитовые операции...
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Приходилось ли вам сталкиваться с требованиями, в которых вас могли попросить поднять тревогу или выдать ошибку, когда метод Java занимает больше...
Полный курс Java для разработчиков веб-сайтов и приложений
Полный курс Java для разработчиков веб-сайтов и приложений
Получите сертификат Java Web и Application Developer, используя наш курс.
1
5
3 643
6
Перейти к ответу Данный вопрос помечен как решенный

Ответы 6

Ответ принят как подходящий

Это будет работать:

static String findNumber(List<Integer> arr, int k) {
            String res = "YES";
            for (int i = 0; i < arr.size(); i++) {
                if (k == arr.get(i))
                    res = "YES";
                    break;
                else
                    res = "NO";

            }

            return res;

        }

Как только вы найдете целое число, вы должны остановить цикл, и вы можете сделать это с помощью break

если вы хотите пойти на подобное исправление, вы должны были просто заменить все if else на if (found) return "YES";

Stultuske 18.07.2019 11:24

попробуй оптимизировать свой код....

способ 1 (используя цикл for-each):

 static String findNumber(List<Integer> arr, int k) { 
        for (Integer integer : arr) {
            if (integer == k) {
                return "YES";
            }
        }
        return "NO"; 
    }

другой способ (с использованием тернарного оператора):

static String findNumber(List<Integer> arr, int k) { 
    return arr.contains(k) ? "YES" : "NO";
}

Вы можете просто использовать arr.contains(), чтобы получить логическое значение того, находится ли Integer в списке или нет. Затем вы можете перевести это значение в YES или NO (если вам это действительно нужно):

String yesNo = arr.contains(k) ? "YES" : "NO";

или измените возвращаемый тип на логический и скажите: return arr.contains(k);

Stultuske 18.07.2019 11:48

Использование потоков:

static String findNumber(List<Integer> arr, int k) {
    return arr.stream()
        .filter(e -> e == k)
        .findFirst()
        .map(e -> "YES")
        .orElse("NO");
}
    public static String isListContainsNumber(List<Integer> nums, int n) {
           return nums.stream().anyMatch(el -> el.equals(n)) ? "YES" : "NO";
    }

Основная проблема с вашим кодом в том, что даже если он находит целочисленный объект в ArrayList, после установки res = Yes он все равно продолжает итерацию. Поэтому существует вероятность того, что в списке могут быть другие значения не нужного типа данных, тем самым возвращая res значение No. Решение здесь состоит в том, чтобы использовать оператор перехода, такой как break, который завершает процесс цикла, как только встречается целое число. Надеюсь, поможет!

Спасибо :) .. оператор прыжка - это то, что я пропустил. Добавление «break» после возврата «YES» решило проблему.

NavsTrend 19.07.2019 10:56

Другие вопросы по теме