From b02cb4c3afdd19bb06ae2e95e2f9fe0681e6cf33 Mon Sep 17 00:00:00 2001 From: Liu Xuyan <1739606183@qq.com> Date: Fri, 14 Mar 2025 07:16:49 +0800 Subject: [PATCH] Add FindCommand class to handle level-9 task finding matching task. Update relevant classes (HelpCommand, Parser) for newly added class. --- src/main/java/commands/FindCommand.java | 42 +++++++++++++++++++++++++ src/main/java/commands/HelpCommand.java | 1 + src/main/java/data/TaskList.java | 11 ++++++- src/main/java/data/task/Task.java | 4 +++ src/main/java/parser/Parser.java | 9 ++++++ 5 files changed, 66 insertions(+), 1 deletion(-) create mode 100644 src/main/java/commands/FindCommand.java diff --git a/src/main/java/commands/FindCommand.java b/src/main/java/commands/FindCommand.java new file mode 100644 index 000000000..0c7e7969b --- /dev/null +++ b/src/main/java/commands/FindCommand.java @@ -0,0 +1,42 @@ +package commands; + +import data.task.Task; + +import java.util.ArrayList; +import java.util.List; + +public class FindCommand extends Command { + + public static final String COMMAND_WORD = "find"; + + public static final String MESSAGE_USAGE = COMMAND_WORD + + ": Displays all tasks as a list with target key word(s)." + + " -Example: " + COMMAND_WORD + + " read"; + + /** Offset required to convert between 1-indexing and 0-indexing. */ + public static final int DISPLAYED_INDEX_OFFSET = 1; + + private final String keyword; + + public FindCommand(String keyword) { + this.keyword = keyword; + } + + public String execute() { + List matchingTasks = taskList.findMatch(keyword); + + if (matchingTasks.isEmpty()) { + return "You don't have any matching task in your list."; + } + + StringBuilder sb = new StringBuilder(); + sb.append("Here are the matching tasks in your list:").append("\n"); + int size = matchingTasks.size(); + for (int i = 0; i < size - DISPLAYED_INDEX_OFFSET; i += 1) { + sb.append((i + DISPLAYED_INDEX_OFFSET)).append(". ").append(matchingTasks.get(i).toString()).append("\n"); + } + sb.append(size).append(". ").append(matchingTasks.get(size - 1).toString()); + return sb.toString(); + } +} diff --git a/src/main/java/commands/HelpCommand.java b/src/main/java/commands/HelpCommand.java index 7b44ce958..105c24a51 100644 --- a/src/main/java/commands/HelpCommand.java +++ b/src/main/java/commands/HelpCommand.java @@ -18,6 +18,7 @@ public String execute() { + "\n" + TodoCommand.MESSAGE_USAGE + "\n" + DeadlineCommand.MESSAGE_USAGE + "\n" + EventCommand.MESSAGE_USAGE + + "\n" + FindCommand.MESSAGE_USAGE + "\n" + MarkCommand.MESSAGE_USAGE + "\n" + UnmarkCommand.MESSAGE_USAGE + "\n" + DeleteCommand.MESSAGE_USAGE; diff --git a/src/main/java/data/TaskList.java b/src/main/java/data/TaskList.java index 83403756b..c561a172f 100644 --- a/src/main/java/data/TaskList.java +++ b/src/main/java/data/TaskList.java @@ -3,7 +3,6 @@ import data.task.Task; import java.util.ArrayList; -import java.util.Arrays; import java.util.List; public class TaskList { @@ -41,4 +40,14 @@ public void deleteTask(int taskIndex) { public List getAllTasks() { return this.tasks; } + + public List findMatch(String keyWork) { + List internalList = new ArrayList<>(); + for (Task task : tasks) { + if (task.getTaskName().contains(keyWork)) { + internalList.add(task); + } + } + return internalList; + } } diff --git a/src/main/java/data/task/Task.java b/src/main/java/data/task/Task.java index 8ec70b023..e70eb960d 100644 --- a/src/main/java/data/task/Task.java +++ b/src/main/java/data/task/Task.java @@ -9,6 +9,10 @@ public Task(String taskName) { this.isDone = false; } + public String getTaskName() { + return taskName; + } + public String getStatusIcon() { return (isDone ? "X" : " "); // mark done task with X } diff --git a/src/main/java/parser/Parser.java b/src/main/java/parser/Parser.java index 419033664..f09e96bb4 100644 --- a/src/main/java/parser/Parser.java +++ b/src/main/java/parser/Parser.java @@ -5,6 +5,7 @@ import commands.DeleteCommand; import commands.EventCommand; import commands.ExitCommand; +import commands.FindCommand; import commands.HelpCommand; import commands.InvalidCommand; import commands.ListCommand; @@ -61,6 +62,14 @@ public Command parseCommand(String userInput) { "Use: event /from /to "); } + case FindCommand.COMMAND_WORD: + try { + String keyword = inputParts[1]; + return new FindCommand(keyword); + } catch (ArrayIndexOutOfBoundsException e) { + return new WrongFormatCommand("Invalid format! Use: Find "); + } + case MarkCommand.COMMAND_WORD: try { int taskIndex = Integer.parseInt(inputParts[1]);