Разработайте программу — список дел, который управляется командами в консоли

Написала код, да к сожалению нерабочий. Вот ниже задание. После будет код. Не соображу, как 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();
}
→ Ссылка
Автор решения: Airat

Рабочий код:

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;
            }
        }
    }
}
→ Ссылка