Поиск числа в коллекции
Подскажите, пожалуйста, как мне из коллекции вытащить только числа:
List<String> string = new ArrayList<>(List.of("s", "45", "4", "w", "-2", "gjg"))
Подскажите, пожалуйста, как мне из коллекции вытащить только числа:
List<String> string = new ArrayList<>(List.of("s", "45", "4", "w", "-2", "gjg"))
Пусть у вас есть список из строк:
List<String> strings = List.of("s", "45", "4", "w", "-2", "gjg");
Создадим вспомогательный метод, который будет переводить строку в число, а если это не удалось сделать, то возвращать null
:
private static Integer parseIntOrNull(String string) {
try {
return Integer.parseInt(string);
} catch (NumberFormatException exception) {
return null;
}
}
Теперь создадим список чисел и заполним его, используя метод выше:
List<Integer> integers = new ArrayList<>();
for (String string : strings) {
Integer integer = parseIntOrNull(string);
if (integer != null) {
integers.add(integer);
}
}
Результат:
System.out.println(integers); // => [45, 4, -2]
Можно проверить, является ли строка числом при помощи метода String::matches
и регулярного выражения (достаточно простого для целых чисел [+-]?\\d+
) вместо того, чтобы парсить строки и отлавливать ненужные исключения.
Также следует заметить, что коллекция должна быть правильно типизирована, например, List<String>
.
Вопрос о том, чтобы вытащить из коллекции некоторые числа можно решить через фильтр, не затрагивая исходную коллекцию, или же путём удаления "не-чисел" из исходной коллекции.
List<String> strings = new ArrayList<>(List.of("s", "45", "4", "w", "-2", "gjg"));
// создать новый список строк
List<String> stringNums = strings.stream()
.filter(s -> s.matches("[+-]?\\d+"))
.collect(Collectors.toList());
// [45, 4, -2]
// создать новый список целых чисел
List<Integer> nums = strings.stream()
.filter(s -> s.matches("[+-]?\\d+"))
.map(Integer::parseInt)
.collect(Collectors.toList());
// [45, 4, -2]
// изменить входной список, удалить не-числа
strings.removeIf(s -> !s.matches("[+-]?\\d+"));
// [45, 4, -2]