Поиск числа в коллекции

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

Подскажите, пожалуйста, как мне из коллекции вытащить только числа:

List<String> string = new ArrayList<>(List.of("s", "45", "4", "w", "-2", "gjg"))

Ответы

▲ 0Принят

Пусть у вас есть список из строк:

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]
▲ 0

Можно проверить, является ли строка числом при помощи метода 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]