Как в Java из строки сделать список чисел?

288
05 апреля 2018, 14:47

Есть строка с цифрами от 0 до 9, без пробелов. На выходе должен получиться список int, при чем если после какой-то единицы стоит ноль, то это число должно быть записано в списке как 10. Таким образом не выходе должен получиться список из чисел от 1 до 10. Как это сделать?

Answer 1

По вашим условиям '0' тоже должен присутствовать (когда '0' в начале строки или не после '1'), то есть диапазон не от 1 до 10, а от 0 до 10:

    String str = "010320101";
    int[] numbers = str.replaceAll("10", ":").chars().map(i -> i -= 48).toArray();

Результат:

    numbers[i]:
    0 = 0
    1 = 10
    2 = 3
    3 = 2
    4 = 0
    5 = 10
    6 = 1
Answer 2

Извлечение чисел от 0 до 10 из потока циферь.
Главное сформулировать условие, когда заканчивается одно число и начинается другое.
Если на предыдущей итерации получена единица и сейчас перед нами ноль, то мы всё ещё находимся на том же самом числе (на десятке). В остальных случаях мы перешли на следующее число.
Когда случился переход на следующее число, предыдущее надо вывести (поместить в массив)

// чтобы просто переводить символы в числа/цифры
public static Map<Character, Integer> CHAR2DIGIT = new HashMap<Character, Integer>() {{
    put('0', 0);
    put('1', 1);
    put('2', 2);
    put('3', 3);
    put('4', 4);
    put('5', 5);
    put('6', 6);
    put('7', 7);
    put('8', 8);
    put('9', 9);
}};
public static List<Integer> numbers(String input) {
    List<Integer> numbers = new ArrayList<>();
    int number = -1; // сюда будем собирать очередное число. -1 когда находимся в самом начале потока и ещё не получено ни одной цифры
    for (int i = 0; i < input.length(); i++) {
        int digit = CHAR2DIGIT.get(input.charAt(i)); // очередная цифра
        if (digit != 0 || number != 1) { // условие перехода на следующее число
            if (number > -1) numbers.add(number); // вывод предыдущего
            number = 0; // сброс для расчёта нового числа
        }
        number = number * 10 + digit; // незамысловатая формула для сбора числа из его циферь
    }
    if (number > -1) numbers.add(number); // не забыть вывести последнее число после цикла
    return numbers;
}
public static void main(String[] args) {
    for (Integer n : numbers("1234567891001")) {
        System.out.println(n);
    }
}
Answer 3

Можно сделать с использованием Java 8 Stream API:

    public void someMethod(){
    String str = "1234567890";
    List<Integer> list = Arrays.stream(str.split("")).map(s -> Integer.valueOf(s)).collect(Collectors.toList());
    list.replaceAll(i -> i==0?10:i);
    list.forEach(System.out::println);
}
READ ALSO
Как взаимодействовать с rar архивами c++?

Как взаимодействовать с rar архивами c++?

Хочу написать подбор паролей(на лабу нужно) для rar архивовСуществуют ли какие то апишки что бы у меня как минимум был функционал открытия...

240
В чём отличие flash drive от thumb drive для функции GetDriveType?

В чём отличие flash drive от thumb drive для функции GetDriveType?

Разбираюсь с WinAPI-функцией GetDriveTypeОна возвращает тип диска

264
Ловить утечки и порчу памяти под Windows из QtCreator

Ловить утечки и порчу памяти под Windows из QtCreator

Нужно ловить утечки и порчу памяти под Windows из QtCreatorvalgrind, к сожалению, под Windows не работает

216
Замена присвоения := из Pascal на = из C++ при помощи #define

Замена присвоения := из Pascal на = из C++ при помощи #define

Возможно ли как-нибудь заменить присвоение из Pascal на С++ при помощи #define?

225