Как считывать с консоли команды в которых и string и Integer одновременно?
Сразу сделаю замечение о том,что НЕ подсказывайте готовое решение. Это учебная задача. и по теме лекции у меня вопросов нет. (Списки и динам массивы). А Вот как счтать данные не знаю и прошу лишь дать напрвление для изучения. Сама задача такая: " Существует ряд методов для класса ArrayList: add(n) - вставка в конец, add(i, n) - вставка по индексу, remove(i) - удаление по индексу, set(i, n) - изменение значения по индексу.
На вход программе подаются строки, первая из которых create N - создает исходный список с числами от 1 до N включительно. Сигнатуры остальных команд:
add 5 - вставляет 5 в конец списка
add 5 6 - вставляет 6 по индексу 5
remove 7 - удаляет 7 элемент списка
set 7 3 - заменяет значение седьмого элемента списка на 3
Команда printList - сигнализирует о конце ввода данных и должна вывести на экран список, полученный после всех манипуляций"
Данные с консоли я считал и цикл завершил. Далее сделал список разбив по nexLine (в каждой ячейке у меня хранится комманда и данные). Теперь хотел считывать через "split" каждый элемент списка и понимать команду и значение для изменения (Команду сравнитвать со строкой ). И все реально до тех пор пока я в каждой ячейке списка получаю два значения (команду и цифры), а вот когда у меня три значение (комманда, цифра и цифра).Сталкиваюсь со сложностью. Конечно я могу каждую ячейку списка проверять на длинну массива (еще раз разбивать строку по пробелам). и проверять длинну массива. Но может быть естькакой-то метод или класс который лучше подходит, чем куча if-ов или swithc? Возможно задача решается через Pattern, Matcher (регулярные выражения). Сейчас пишу разбивая на массивы и далее буду команды считывать через if . Задача сдана Использиются условные выражения.
Scanner in = new Scanner(System.in);
List<String> l1 = new ArrayList();
while (true) {
String current = in.nextLine();
if (current.equals("printList")) break;
l1.add(current);//list список всех команд
}
String [] [] arrcom=new String[l1.size()] [];//массив из строк как бы
двумерный
for (int i = 0; i <l1.size() ; i++) {
String[] k= l1.get(i).split( " "); //двумерый массив
arrcom[i]=k; // разделяем строку по пробелам и засовываем в
массив
}
//считали сreate и создали массив данной длинны и пото этот массив
будем
изменять
int n= Integer.parseInt(arrcom[0][1]);//длинна списка
List<Integer> arr = new ArrayList(); // список для изменений
for (int i = 0; i < n; i++) {
arr.add(i, i+1);
}//заплнии список
// бежим по всему массиву и смотрим что надо сделать
for (int i = 1; i < arrcom.length; i++) {// бежим по командам
if(arrcom[i][0].equals("remove"))
arr.remove(Integer.parseInt(arrcom[i]
[1]));//удаляет
if((arrcom[i].length==2)&(arrcom[i][0].equals("add")))
arr.add(Integer.parseInt(arrcom[i][1]));//добавляем
if((arrcom[i].length==3)&(arrcom[i][0].equals("add")))
arr.add((Integer.parseInt(arrcom[i][1])),Integer.parseInt(arrcom[i]
[2]));
if((arrcom[i][0].equals("set")))
arr.set((Integer.parseInt(arrcom[i][1])),Integer.parseInt(arrcom[i]
[2]));
}
for (int i = 0; i <arr.size() ; i++) {
System.out.print(arr.get(i)+ " ");
}
Ответы (1 шт):
Как по мне , то лучше попрактиковаться в ООП. Сделайте общий класс команды, который будет парсить построчно ваши команды и порожать свои классы-наследники в зависимости от получе6нной команды. А уже каждый класс-наследник будет контролировать свои аргументы (например, их количество) и выполнять их для вашего листа.
import java.util.List;
import java.util.stream.IntStream;
public abstract class Command {
protected final String command;
protected final Integer params[];
private static Command of(String args) {
try {
final String[] split = args.split(" ");
final String command = split[0].trim().toLowerCase();
final Integer[] params = IntStream.range(1, split.length)
.map(i -> Integer.valueOf(split[i].trim()))
.boxed()
.toArray(Integer[]::new);
switch(command){
case "add": return new Add(command, params);
default: throw new UnsupportedOperationException("Not implemented yet for command " + command);
}
} catch (NullPointerException | ArrayIndexOutOfBoundsException | NumberFormatException e) {
throw new IllegalArgumentException("Not implemented yet for command " + args);
}
}
public static List <Integer> execute (List <Integer> list, String ... commandLines) {
for (String commandLine : commandLines) of(commandLine).execute(list);
return list;
}
protected Command(String command, Integer [] params) {
this.command = command;
this.params = params;
}
protected abstract void execute(List <Integer> list);
}
import java.util.Arrays;
import java.util.List;
public class Add extends Command{
protected Add(String command, Integer [] params) {
super(command, params);
}
@Override
protected void execute(List <Integer> list) {
if (params.length==1) list.add(params[1]);
else if (params.length==2) list.add(params[1], params[2]);
else throw new IllegalArgumentException("Illegal arguments for command 'add' " + Arrays.toString(params));
}
}
Теперь дописывайте имплементации для остальных нужных вам методов, а также класс, для пользовательского ввода, из которого после того, как юзер введет printList, все команды будут преобразованы в массив, а также будет вызван метод List result = Command.execute(list, commandLines); в которой нужно передать массив введнных пользователем команд и список, над которым будут выполнены все команды.