Как разбить проверить каждое число на четность цифр входящих в это число
Есть коллекция чисел , и нужно удалить те числа в состав которых входят четные цифры .Например число 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--;
}
Ответы (2 шт):
Автор решения: vova pro43
→ Ссылка
Есть решение:
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));
}
}
Автор решения: Nowhere Man
→ Ссылка
Упрощенный вариант с использованием 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);