Как разбить проверить каждое число на четность цифр входящих в это число

Рейтинг: -2Ответов: 2Опубликовано: 10.02.2023

Есть коллекция чисел , и нужно удалить те числа в состав которых входят четные цифры .Например число 22 состоит из двух двоек и его надо удалить так как обе цифры четные, а вот число 23 состоит из 2 и 3 его не нужно удалять, я попробовал сделать цикл но ничего не получилось

import java.util.ArrayList;
import java.util.List;

public class numers {
    public static void main(String[] args) {
        List<Object> numbers = new ArrayList<>();
        numbers.add(13);
        numbers.add(24);
        numbers.add(68);
        numbers.add(22);
        numbers.add(28);
        numbers.add(10);



        for (int i = 0; i <= numbers.size() - 1; i++) {
            int a =(Integer) numbers.get(i);
            while (a > 0) {
                a = a % 10;
                if (a % 2 == 0) {
                    System.out.println(a);
                    numbers.remove(i);
                    i--;
                    break;


                }

            }

        }
    }
}

Получилось что то типо такого

 for (int i = 0; i <= numbers.size() - 1; i++) {
                        int a = (Integer) numbers.get(i);
                        String s = String.valueOf(Integer.valueOf(a));
                        if(!s.contains("1")&&!s.contains("3")&&!s.contains("5")&&!s.contains("7")&&!s.contains("9")){
                            numbers.remove(i);
                            i--;
                        }

Ответы

▲ 0

Есть решение:

public static void main(String[] args) {
        // TODO Автоматически созданная заглушка метода
        List<Integer> numbers = new ArrayList<>();
        numbers.add(13);
        numbers.add(24);
        numbers.add(68);
        numbers.add(22);
        numbers.add(28);
        numbers.add(10); 
        
        List<Integer> removeNum = new ArrayList<>();
        // Проверка:
        for (int i = 0; i < numbers.size(); i++) {
            int Num = 0;
            String[] testNum = numbers.get(i).toString().split("");
            for (int j = 0; j < testNum.length; j++) {
                if (Integer.parseInt(testNum[j]) % 2 == 0) {
                    Num += 1; // Num = Num + 1;
                }
            }
            if (Num == testNum.length) {
                removeNum.add(numbers.get(i));
            }
        }
        for (int i = 0; i < removeNum.size(); i++) {
            numbers.remove(removeNum.get(i));
        }
        
        // Вывод на экран:
        for (int i = 0; i < numbers.size(); i++) {
            System.out.println(numbers.get(i));
        }
    }
▲ 0

Упрощенный вариант с использованием List::removeIf, упоминавшимся в предыдущем ответе на сходную задачу:

List<Integer> mutableInts = new ArrayList<>(Arrays.asList(13, 24, 68, 22, 28, 10, 91));

// с регуляркой
mutableInts.removeIf(n -> String.valueOf(n).matches("[02468]+"));
// -> [13, 10, 91] 

// с "просмотром" цифр из строки
mutableInts.removeIf(n -> String.valueOf(Math.abs(n))
    .chars() // символы строки
    .map(Character::getNumericValue) // преобразовать в цифровое значение
    .allMatch(d -> (d & 1) == 0)
);

Аналогичное решение, использующее разбиение числа на цифры:

mutableInts.removeIf(
    n -> IntStream.iterate(Math.abs(n), d -> d > 0, d -> d / 10)
        .map(d -> d % 10) // получить цифру
        .allMatch(d -> (d & 1) == 0) // проверить на четность
);

Или же определяется функция-предикат:

// class MyClass
public static boolean allEvens(int n) {
    int m = Math.abs(n);
    while (m > 0) {
        if ((m % 10 & 1) == 1) {
            return false;  // нашлась "нечётная" цифра
        }
        m /= 10;
    }
    return true;
}

которая и вызывается через ссылку: mutableInts.removeIf(MyClass::allEvens);