Разработайте программу — список дел, который управляется командами в консоли
Написала код, да к сожалению нерабочий. Вот ниже задание. После будет код. Не соображу, как LIST написать.
Разработайте программу — список дел, который управляется командами в консоли. Команды: LIST, ADD, EDIT, DELETE. Для работы с данными списка дел в проекте находится класс TodoList, который должен отвечать за хранение и работу со списком дел. Реализуйте все методы и проверьте класс с помощью существующих тестов. В классе Main напишите код для реализации взаимодействия с пользователем через ввод команд в консоль. Принцип работы команд:
LIST — выводит дела с их порядковыми номерами; ADD — добавляет дело в конец списка или дело на определённое место, сдвигая остальные дела вперёд, если указать номер; если указан несуществующий индекс - добавить в конец списка. EDIT — заменяет дело с указанным номером; если указан несуществующий индекс - ничего не делать. DELETE — удаляет; если указан несуществующий индекс - ничего не делать. Команды вводятся пользователем в консоль одной строкой.
Примеры работы со списком дел (жирным шрифтом выделен ввод пользователя)
ADD buy milk Добавлено дело "buy milk" ADD learn java Добавлено дело "learn java" LIST 0 - buy milk 1 - learn java EDIT 0 make a cup of tea Дело "buy milk" заменено на "make a cup of tea" DELETE 1 Дело "learn java" удалено LIST 0 - make a cup of tea DELETE 100 Дело с таким номером не существует
package practice;
import java.util.ArrayList;
import java.util.Scanner;
public class TodoList {
ArrayList<String> todoList = new ArrayList<>();
Scanner scanner = new Scanner(System.in);
String deal = scanner.nextLine();
public void add(String todo) {
// TODO: добавьте переданное дело в конец списка
todoList.add(todo);
}
public void add(int index, String todo) {
// TODO: добавьте дело на указаный индекс,
// проверьте возможность добавления
if (index >= 0 && index <= todoList.size()) {
todoList.add(index, todo);
} else {
todoList.add(todo);
}
}
public void edit(int index, String todo) {
// TODO: заменить дело на index переданным todo индекс,
// проверьте возможность изменения
if (index > 0 && index <= todoList.size()) {
todoList.set(index, todo);
} else {
}
}
public void delete(int index) {
// TODO: удалить дело находящееся по переданному индексу,
// проверьте возможность удаления дела
if (index > 0 && index < (todoList.size()-1)) {
todoList.remove(index);
} else {
}
}
public ArrayList<String> getTodos() {
// TODO: вернуть список дел
return todoList;
}
}
package practice;
import java.util.ArrayList;
import java.util.Scanner;
import java.util.regex.Pattern;
public class Main {
private static TodoList todoList = new TodoList();
static ArrayList<String> arrayListTodo = todoList.getTodos();
public static void main(String[] args) {
Scanner scanner = new Scanner(System.in);
String commandStr = scanner.nextLine();
String[] wordsOfCommandStr = commandStr.split(" ");
String command = wordsOfCommandStr[0].trim();
boolean thisIsCommand = Pattern.matches(("^[A-Z]+"), wordsOfCommandStr[0].trim());//если нулевой элемент из заглав лат букв, то это одно из ADD и тд
boolean thisIsIndex = Pattern.matches(("^[0-9]+"), wordsOfCommandStr[1].trim());// если первый элемент из цифр, то это заданный пользователем индекс
int index = 0;
String changedDeal = "";
String deletedDeal ="";
for (int i = 0; i < wordsOfCommandStr.length; i++) {
if (thisIsCommand && command.equals("ADD") && thisIsIndex) {
index = Integer.parseInt(wordsOfCommandStr[1].trim());
if (index > -1 && index <= wordsOfCommandStr.length) {
todoList.add(index, commandStr.substring(' ').trim());
System.out.println("на позицию " + index + " добавлено дело " + "\"" + commandStr.substring(' ') + "\"");
} else {
todoList.add(commandStr.substring(' '));
System.out.println("добавлено дело " + "\"" + commandStr.substring(' ') + "\"");
}
} else if (thisIsCommand && command.equals("ADD")) {
todoList.add(commandStr.substring(' '));
System.out.println("добавлено дело " + "\"" + commandStr.substring(' ') + "\"");
}
if (thisIsCommand && command.equals("EDIT") && thisIsIndex) {
index = Integer.parseInt(wordsOfCommandStr[1]);
if (index > -1 && index <= wordsOfCommandStr.length) {
changedDeal = arrayListTodo.get(index);
todoList.add(index, commandStr.substring(' '));
System.out.println("дело " + "\"" + changedDeal + "\"" + "заменено на дело " + "\"" + commandStr.substring(' ') + "\"");
} else {}
}
if (thisIsCommand && command.equals("DELETE") && thisIsIndex) {
index = Integer.parseInt(wordsOfCommandStr[1]);
if (index > -1 && index <= wordsOfCommandStr.length) {
deletedDeal = arrayListTodo.get(index);
todoList.delete(index);
System.out.println("удалено дело " + "\"" + deletedDeal + "\"");
} else {}
}
if (thisIsCommand && command.equals("LIST")) {
int ind = -1;
for (String str : arrayListTodo) {
ind++;
System.out.println(ind + " - " + str + "\n");
}
} else {
System.out.println("выберите другую команду");
}
}
}
// TODO: написать консольное приложение для работы со списком дел todoList
}
Ответы (2 шт):
В этом коде черт ногу сломит. Почему у вас сканер во всех классах? Даже в задании написано написать класс Main для взаимодействия с пользователем. Откуда столько условных операторов, в т.ч. вложенных, а также пустых else{}? Почему вы не создаете приватные методы? Неужели дублировать логику легче? Таких вопросов, мягко говоря, много...
Попробуйте сделать так (тесты и рефакторинг за вами)
import java.util.ArrayList;
import java.util.List;
import java.util.stream.Collectors;
import java.util.stream.IntStream;
public class TodoList {
private final List<String> todoList = new ArrayList<>();
public void add(String todo) {
todoList.add(todo);
}
public void add(Integer index, String todo) {
if (exist(index)) todoList.add(index, todo);
else add(todo);
}
public void edit(Integer index, String todo) {
if (exist(index)) todoList.set(index, todo);
}
public void delete(int index) {
if (exist(index)) todoList.remove(index);
}
public String list() {
return IntStream.range(0, todoList.size())
.mapToObj(i -> i + " - " + todoList.get(i))
.collect(Collectors.joining("\n"));
}
private boolean exist(Integer index) {
return index != null && index >= 0 && index < todoList.size();
}
}
import java.util.Arrays;
import java.util.Scanner;
public class Main {
public static void main(String[] args) {
Scanner scanner = new Scanner(System.in);
TodoList todoList = new TodoList();
while (true) {
UserInput userInput = parse(scanner.nextLine());
switch (userInput.getCommand()) {
case "LIST":
System.out.println(todoList.list());
break;
case "ADD":
todoList.add(userInput.getIndex(), userInput.getTask());
break;
case "EDIT":
todoList.edit(userInput.getIndex(), userInput.getTask());
break;
case "DELETE":
todoList.delete(userInput.getIndex());
break;
}
}
}
private static UserInput parse(String input) {
String[] split = input.split(" ");
if (split.length == 1) return new UserInput(input.toUpperCase(), null, null);
try {
return new UserInput(split[0].toUpperCase(), Integer.valueOf(split[1]), String.join(" ",
Arrays.copyOfRange(split, 2, split.length)));
} catch (NumberFormatException e) {
return new UserInput(split[0].toUpperCase(), null, String.join(" ",
Arrays.copyOfRange(split, 1, split.length)));
}
}
private static class UserInput {
private final String command;
private final Integer index;
private final String task;
public UserInput(String command, Integer index, String task) {
this.command = command;
this.index = index;
this.task = task;
}
public String getCommand() {
return command;
}
public Integer getIndex() {
return index;
}
public String getTask() {
return task;
}
}
}
Альтернативная реализация метода list без использования функционалки (стримов):
public String list() {
StringBuilder sb = new StringBuilder();
for (int i = 0; i < todoList.size(); i++) {
sb.append(i).append(" - ").append(todoList.get(i)).append("\n");
}
return sb.toString();
}
Рабочий код:
import java.util.ArrayList;
import java.util.Scanner;
public class Main {
public static void main(String[] args) {
System.out.println("Список команд: \nLIST — выводит дела с их порядковыми номерами;" +
"\nADD — добавляет дело в конец списка или дело на определённое место, сдвигая остальные дела вперёд, если указать номер;" +
"\nEDIT — заменяет дело с указанным номером; \nDELETE — удаляет; \nВызовите команду:");
Scanner scanner = new Scanner(System.in);
ArrayList<String> todoList = new ArrayList<>() {{
add(0, "Позавтракать");
add(1, "Умыться");
add(2, "Почитать книгу");
add(3, "Поработать");
add(4, "Пообедать");
}};
while (true) {
String comanda = scanner.nextLine();
String[] naSlova = comanda.split(" ");
for (int i = 0; i < naSlova.length; i++) {
if (naSlova[i].equals("LIST")) {
for (int j = 0; j < todoList.size(); j++) {
System.out.println(todoList.get(j));
}
} else if (naSlova[0].equals("ADD") && naSlova.length == 2) {
todoList.add(naSlova[1]);
System.out.println("Вы добавили новое дело в конец списка:");
for (int j = 0; j < todoList.size(); j++) {
System.out.println(todoList.get(j));
}
break;
} else if (naSlova[0].equals("ADD") && naSlova.length > 2) {
todoList.add(Integer.parseInt(naSlova[1]) - 1, naSlova[2]);
System.out.println("Вы добавили новое дело: " + naSlova[2] + ", в позицию номер: " + naSlova[1] + "\nИзмененный список дел:");
for (int j = 0; j < todoList.size(); j++) {
System.out.println(todoList.get(j));
}
break;
} else if (naSlova[0].equals("EDIT") && naSlova.length == 3) {
todoList.set(Integer.parseInt(naSlova[1]) - 1, naSlova[2]);
System.out.println("Вы заменили дело в позиции номер: " + naSlova[1] + " на: " + naSlova[2] + "\nИзмененный список дел:");
for (int j = 0; j < todoList.size(); j++) {
System.out.println(todoList.get(j));
}
break;
} else if (naSlova[0].equals("DELETE") && naSlova.length == 2) {
System.out.println("Вы удалили дело " + todoList.get(Integer.parseInt(naSlova[1]) - 1) + ", которое было в позиции номер: " + naSlova[1] + "\nИзмененный список дел:");
todoList.remove(Integer.parseInt(naSlova[1]) - 1);
for (int j = 0; j < todoList.size(); j++) {
System.out.println(todoList.get(j));
}
break;
} else {
System.out.println("Не верная команда. Вызовите правильну команду:");
}
break;
}
}
}
}