Удалить нечетные элементы из ArrayList

public static List<Integer> removeOddNumbers(ArrayList<Integer> list) {
        if (list.isEmpty()) { throw new Error(); }
        List<Integer> toRemove = new ArrayList<>();

        for (int i : list) {
            if (i % 2 != 0) { toRemove.add(i); }
        }
        list.removeAll(toRemove);
        return list;
}

Я пытаюсь удалить все нечетные элементы из ArrayList, а затем возвращаю этот ArrayList.

Я получаю сообщение об ошибке, указывающее на список целых чисел в этой первой строке

Контрольная работа:

ArrayList<Integer> arrayList = new ArrayList<Integer>();
Collections.addAll(arrayList, 3, 5, 6, 24, 7, 9, 1, 8, 28, 11);
ArrayList<Integer> result = removeOddNumbers(arrayList);
System.out.println(result);

Результат:

[6, 24, 8, 28]

Какую ошибку вы получаете?

sarkasronie 16.03.2018 11:30

Вы можете использовать другой список для хранения элемента, который хотите сохранить, или выполнить итерацию в обратном направлении.

assylias 16.03.2018 11:30

Не могли бы вы добавить код, по которому вы звоните removeOddNumbers?

sarkasronie 16.03.2018 11:36
Вопросы, требующие помощи по отладке ("почему этот код не работает?"), должны включать желаемое поведение, конкретная проблема или ошибка и кратчайший код, необходимый для его воспроизведения в самом вопросе. Вопросы без четкой постановки проблемы не будут полезны другим читателям. См .: Как создать минимальный, полный и проверяемый пример.
Turing85 16.03.2018 11:41
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
Как вычислять биты и понимать побитовые операторы в Java - объяснение с примерами
Как вычислять биты и понимать побитовые операторы в Java - объяснение с примерами
В компьютерном программировании биты играют важнейшую роль в представлении и манипулировании данными на двоичном уровне. Побитовые операции...
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Приходилось ли вам сталкиваться с требованиями, в которых вас могли попросить поднять тревогу или выдать ошибку, когда метод Java занимает больше...
Полный курс Java для разработчиков веб-сайтов и приложений
Полный курс Java для разработчиков веб-сайтов и приложений
Получите сертификат Java Web и Application Developer, используя наш курс.
3
4
3 708
4
Перейти к ответу Данный вопрос помечен как решенный

Ответы 4

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

Если вы используете Java 8, вы можете просто использовать Коллекция :: removeIf:

list.removeIf(i -> i % 2 != 0);

Полный метод должен выглядеть так:

public static List<Integer> removeOddNumbers(List<Integer> list) {
    list.removeIf(i -> i % 2 != 0);
    return list;
}

Пример

List<Integer> list = new ArrayList<>(Arrays.asList(1, 2, 3, 6, 5, 4));
list.removeIf(i -> i % 2 != 0);
System.out.println(removeOddNumbers(list));

Выходы

[2, 6, 4]

где бы я это использовал?

qwert123 16.03.2018 11:33

что ты имел ввиду где бы я это использовал?

YCF_L 16.03.2018 11:33

Думаю, у него другая проблема. Код в основном должен работать - даже если это не самый простой способ.

sarkasronie 16.03.2018 11:36

получение ошибки не удается найти символ в List <Integer>

qwert123 16.03.2018 11:38

@ qwert123 используйте List<Integer> вместо ArrayList<Integer>, проверьте мою правку

YCF_L 16.03.2018 11:39

что ты имел ввиду @sarkasronie?

YCF_L 16.03.2018 11:40

Если вы намекнете ему, в чем была его проблема, вы получите от меня +1. Потому что его проблема заключалась не в алгоритме удаления нечетных чисел.

sarkasronie 16.03.2018 11:43

@sarkasronie OP кажется, что он вызывает свой метод, используя List<Integer> list и List<Integer> cannot be converted to ArrayList<Integer>

YCF_L 16.03.2018 11:55

@ qwert123 до вас, чтобы понять больше, взгляните на stackoverflow.com/questions/14903145/…

YCF_L 16.03.2018 12:15

лямбда-способ:

public static List<Integer> filter(List<Integer> numberList) {
    return numberList.stream()
        .filter(number -> number % 2 != 0)
        .collect(Collectors.toList());
}

Вы должны вызвать этот метод так:

List<Integer> list = Arrays.asList(3, 5, 6, 24, 7, 9, 1, 8, 28, 11);
List<Integer> result = removeOddNumbers(numbers);
System.out.println(result);

Проблема в том, что возвращаемый тип метода - List<Integer>, но ваш код ожидает ArrayList, решение состоит в том, чтобы просто использовать общий класс List или, если вы хотите использовать свой код, он должен быть таким:

ArrayList<Integer> arrayList = new ArrayList<Integer>();
Collections.addAll(arrayList, 3, 5, 6, 24, 7, 9, 1, 8, 28, 11);
List<Integer> result = removeOddNumbers(arrayList);
System.out.println(result);

N.B Метод, опубликованный @YCF_L, редактирует список, который вы передаете параметром, мой метод вместо этого создает новый список, оставляя исходный список нетронутым

Действительно. получение ошибки не удается найти символ и в List <Integer>

qwert123 16.03.2018 11:39

@ qwert123 Опубликовать полный класс, вероятно, это синтаксическая ошибка

Emax 16.03.2018 11:40

Класс не дали, но отправили тест

qwert123 16.03.2018 11:43

@ qwert123 исправлено

Emax 16.03.2018 11:48
// you can use Iterator.remove()
List arr = new ArrayList();
        arr .add(10);
        arr .add(20);
        arr .add(30);
        arr .add(1);
        arr .add(2);

        // Remove odd elements
        // Iterator.remove()
        Iterator itr = arr .iterator();
        while (itr.hasNext())
        {
            int x = (Integer)itr.next();
            if (x % 2 != 0)
                itr.remove();
        } 
        System.out.println("Modified ArrayList : "                                     + arr);

Вы должны использовать Iterator, чтобы удалить элементы из списка. Это избавит от необходимости использовать временный список, в котором вы храните нечетные элементы.

public static List<Integer> removeOddNumbers(List<Integer> arrayList) {
    Iterator<Integer> itr = arrayList .iterator();
    while (itr.hasNext())
    {
        int x = (Integer)itr.next();
        if (x % 2 != 0) {
            itr.remove();
        }
    } 
    return arrayList;
}

ИЛИ ЖЕ

Вы можете сделать код намного проще с Java8.

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