#java #строки #список
Есть строка с цифрами от 0 до 9, без пробелов. На выходе должен получиться список int, при чем если после какой-то единицы стоит ноль, то такие ноль и единица должны быть записаны в списке как 10. Таким образом не выходе должен получиться список из чисел от 1 до 10. Как это сделать?
Ответы
Ответ 1
Извлечение чисел от 0 до 10 из потока циферь. Главное сформулировать условие, когда заканчивается одно число и начинается другое. Если на предыдущей итерации получена единица и сейчас перед нами ноль, то мы всё ещё находимся на том же самом числе (на десятке). В остальных случаях мы перешли на следующее число. Когда случился переход на следующее число, предыдущее надо вывести (поместить в массив) // чтобы просто переводить символы в числа/цифры public static MapCHAR2DIGIT = new HashMap () {{ 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 numbers(String input) { List 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); } } Ответ 2
По вашим условиям '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 Дополнение: "должен получиться список" Listnumbers = str.replaceAll("10", ":").chars().mapToObj(i -> i -= 48) .collect(Collectors.toList()); Ответ 3
Можно сделать с использованием Java 8 Stream API: public void someMethod(){ String str = "1234567890"; Listlist = Arrays.stream(str.split("")).map(s -> Integer.valueOf(s)).collect(Collectors.toList()); list.replaceAll(i -> i==0?10:i); list.forEach(System.out::println); }
Комментариев нет:
Отправить комментарий