From 52505dc72ed649cfbc7be9ecb3503e2c6e9444ef Mon Sep 17 00:00:00 2001 From: Sampy147 Date: Mon, 12 Sep 2022 18:22:54 +0800 Subject: [PATCH] Add Level-9 find feature Added the find feature which allows user to find matching tasks using a keyword --- src/main/java/duke/Message.java | 1 + src/main/java/duke/command/FindCommand.java | 27 +++++++++++++++++++++ src/main/java/duke/parser/Parser.java | 13 +++++++++- src/main/java/duke/task/Task.java | 4 +++ src/main/java/duke/task/TaskList.java | 20 +++++++++++++++ src/main/java/duke/ui/Ui.java | 4 +++ 6 files changed, 68 insertions(+), 1 deletion(-) create mode 100644 src/main/java/duke/command/FindCommand.java diff --git a/src/main/java/duke/Message.java b/src/main/java/duke/Message.java index c2c6a1392f..882f109197 100644 --- a/src/main/java/duke/Message.java +++ b/src/main/java/duke/Message.java @@ -19,6 +19,7 @@ public class Message { public static final String FILE_NOT_FOUND = "The memory file cannot be found."; public static final String FILE_READ_ERROR = "There is an error when reading the memory file."; public static final String FILE_CREATE_ERROR = "There is an error when creating the memory file"; + public static final String INVALID_FIND_TASK_FORMAT = "To find a task, please input this format: find {Keyword}"; public static String returnTaskNotFound(TaskList tasks) { return "Task does not exist. Try another number between 1 and " + tasks.getCount(); diff --git a/src/main/java/duke/command/FindCommand.java b/src/main/java/duke/command/FindCommand.java new file mode 100644 index 0000000000..17521b236a --- /dev/null +++ b/src/main/java/duke/command/FindCommand.java @@ -0,0 +1,27 @@ +package duke.command; + +import duke.DukeException; +import duke.storage.Storage; +import duke.task.TaskList; +import duke.ui.Ui; + +public class FindCommand extends Command { + + private String keyword; + + public FindCommand(String keyword) { + this.keyword = keyword; + } + + @Override + public boolean isExit() { + return false; + } + + @Override + public void execute(TaskList tasks, Ui ui, Storage storage) throws DukeException { + String foundTasks = tasks.findTasks(this.keyword); + ui.showFound(foundTasks); + } + +} diff --git a/src/main/java/duke/parser/Parser.java b/src/main/java/duke/parser/Parser.java index 85e0952adb..1de5564f0f 100644 --- a/src/main/java/duke/parser/Parser.java +++ b/src/main/java/duke/parser/Parser.java @@ -28,8 +28,10 @@ public static Command parse(String fullCommand) throws DukeException { return addEvent(fullCommand); } else if (command.equals("todo")) { return addToDo(fullCommand); - } else if (command.equals("delete")){ + } else if (command.equals("delete")) { return deleteTask(fullCommand); + } else if (command.equals("find")) { + return findTask(fullCommand); } throw new DukeException(Message.INVALID_USER_INPUT); } @@ -108,4 +110,13 @@ private static DeleteCommand deleteTask(String command) throws DukeException { } } + private static FindCommand findTask(String command) throws DukeException { + String[] commandList = command.strip().split(" "); + try { + return new FindCommand(commandList[1]); + } catch (IndexOutOfBoundsException e) { + throw new DukeException(Message.INVALID_FIND_TASK_FORMAT); + } + } + } diff --git a/src/main/java/duke/task/Task.java b/src/main/java/duke/task/Task.java index 9561bad442..d2dd9419a5 100644 --- a/src/main/java/duke/task/Task.java +++ b/src/main/java/duke/task/Task.java @@ -21,6 +21,10 @@ public void unmark() { this.isDone = false; } + public String getDescription() { + return this.description; + } + @Override public String toString() { return "[" + getStatusIcon() + "] " + this.description; diff --git a/src/main/java/duke/task/TaskList.java b/src/main/java/duke/task/TaskList.java index 9d2a797edc..ae1a1cd6c5 100644 --- a/src/main/java/duke/task/TaskList.java +++ b/src/main/java/duke/task/TaskList.java @@ -51,6 +51,26 @@ public Task deleteTaskAtPos(int position) throws IndexOutOfBoundsException { return deletedTask; } + public String findTasks(String keyword) { + String foundTasks = ""; + int taskCount = 1; + for (Task task : this.taskArray) { + String description = task.getDescription(); + String[] words = description.split(" "); + for (String word : words) { + if (word.equals(keyword)) { + if (taskCount == 1) { + foundTasks += taskCount + ". " + task; + } else { + foundTasks += "\n" + taskCount + ". " + task; + } + taskCount++; + } + } + } + return foundTasks; + } + public String toSimpleStrings() { String stringedList = ""; for (int i = 0; i < this.count; i++) { diff --git a/src/main/java/duke/ui/Ui.java b/src/main/java/duke/ui/Ui.java index 6a571a2a57..d578119042 100644 --- a/src/main/java/duke/ui/Ui.java +++ b/src/main/java/duke/ui/Ui.java @@ -61,4 +61,8 @@ public void showDeleted(Task task) { showFullMessage("Noted. I've removed this task:\n" + task + "\nNow you have " + this.tasks.getCount() + " tasks in the list."); } + public void showFound(String foundTasks) { + showFullMessage("Here are the matching tasks in your list:\n" + foundTasks); + } + }