From 1d07ff4321cc1c6a542d9dba0125bfff23a93807 Mon Sep 17 00:00:00 2001 From: HarishB99 Date: Tue, 18 Feb 2025 23:48:30 +0800 Subject: [PATCH 1/5] Implement sorting of tasks Tasks were not sorted when displayed Implement sorting of tasks Throw error when start date is after end date for events Tasks are now sorted by time first, followed by their description. Additionally, dates ranges of events are validated so that events can be sorted simply by their start time --- src/main/java/bhaymax/command/EventCommand.java | 4 +++- .../InvalidTimeRangeForEventException.java | 15 +++++++++++++++ src/main/java/bhaymax/task/Task.java | 8 +++++++- src/main/java/bhaymax/task/TaskList.java | 9 +++++++++ .../java/bhaymax/task/timesensitive/Deadline.java | 3 ++- .../java/bhaymax/task/timesensitive/Event.java | 14 ++++++++++---- .../task/timesensitive/TimeSensitiveTask.java | 14 +++++++++++++- 7 files changed, 59 insertions(+), 8 deletions(-) create mode 100644 src/main/java/bhaymax/exception/command/InvalidTimeRangeForEventException.java diff --git a/src/main/java/bhaymax/command/EventCommand.java b/src/main/java/bhaymax/command/EventCommand.java index 9a35539184..77c5735072 100644 --- a/src/main/java/bhaymax/command/EventCommand.java +++ b/src/main/java/bhaymax/command/EventCommand.java @@ -1,6 +1,7 @@ package bhaymax.command; import bhaymax.controller.MainWindow; +import bhaymax.exception.command.InvalidCommandFormatException; import bhaymax.exception.file.FileWriteException; import bhaymax.storage.Storage; import bhaymax.task.TaskList; @@ -34,7 +35,8 @@ public EventCommand(String taskDescription, String start, String end) { } @Override - public void execute(TaskList taskList, MainWindow mainWindowController, Storage storage) throws FileWriteException { + public void execute(TaskList taskList, MainWindow mainWindowController, Storage storage) + throws FileWriteException, InvalidCommandFormatException { Event newEvent = new Event(this.taskDescription, this.start, this.end); int taskListCount = taskList.addTask(newEvent); storage.saveTasks(taskList); diff --git a/src/main/java/bhaymax/exception/command/InvalidTimeRangeForEventException.java b/src/main/java/bhaymax/exception/command/InvalidTimeRangeForEventException.java new file mode 100644 index 0000000000..2e6d5349b0 --- /dev/null +++ b/src/main/java/bhaymax/exception/command/InvalidTimeRangeForEventException.java @@ -0,0 +1,15 @@ +package bhaymax.exception.command; + +/** + * Thrown when the end date for an event precedes its start date + * (which is obviously invalid as you can't have an event end + * before it even starts) + */ +public class InvalidTimeRangeForEventException extends InvalidCommandFormatException { + public static final String ERROR_MESSAGE = "The date range provided for event is incorrect. " + + "End date should be after or equal to the start date"; + + public InvalidTimeRangeForEventException() { + super(InvalidTimeRangeForEventException.ERROR_MESSAGE); + } +} diff --git a/src/main/java/bhaymax/task/Task.java b/src/main/java/bhaymax/task/Task.java index 50d066de7b..da28d071e6 100644 --- a/src/main/java/bhaymax/task/Task.java +++ b/src/main/java/bhaymax/task/Task.java @@ -3,7 +3,7 @@ /** * Represents a generic task */ -public class Task { +public class Task implements Comparable { public static final String DELIMITER = "|"; public static final String SERIAL_FORMAT = "%s " + Task.DELIMITER + " %d " + Task.DELIMITER + " %s"; @@ -52,4 +52,10 @@ public boolean hasSearchTerm(String searchTerm) { public String toString() { return "[" + this.getStatusIcon() + "] " + this.description; } + + @Override + public int compareTo(Task task) { + int differenceInType = this.type.compareTo(task.type); + return (differenceInType != 0) ? differenceInType : this.description.compareTo(task.description); + } } diff --git a/src/main/java/bhaymax/task/TaskList.java b/src/main/java/bhaymax/task/TaskList.java index c971e5944e..1d92206b4a 100644 --- a/src/main/java/bhaymax/task/TaskList.java +++ b/src/main/java/bhaymax/task/TaskList.java @@ -1,5 +1,6 @@ package bhaymax.task; +import java.util.Comparator; import java.util.LinkedList; import bhaymax.command.FilterOption; @@ -92,7 +93,9 @@ public Pair removeTask(int index) { * display dialog boxes with the tasks in this list */ public void showTasks(MainWindow mainWindowController) { + this.tasks.sort(Task::compareTo); this.tasks.stream() + //.sorted() .map(task -> (tasks.indexOf(task) + 1) + TaskList.TASK_LIST_BULLET_POINT_SEPARATOR + task) .reduce((previousTask, nextTask) -> previousTask + System.lineSeparator() + nextTask) @@ -114,7 +117,9 @@ public void showTasks(MainWindow mainWindowController) { */ public void showTasksFilteredByDate( String dateTime, FilterOption filterOption, MainWindow mainWindowController) { + this.tasks.sort(Task::compareTo); String response = this.tasks.stream() + //.sorted() .filter(task -> task instanceof TimeSensitiveTask) .filter(timeSensitiveTask -> ( (TimeSensitiveTask) timeSensitiveTask).hasDateMatchingFilter(dateTime, filterOption)) @@ -133,7 +138,9 @@ public void showTasksFilteredByDate( * display dialog boxes with the matched tasks in this list */ public void showTasksContainingSearchTerm(String searchTerm, MainWindow mainWindowController) { + this.tasks.sort(Task::compareTo); String response = this.tasks.stream() + //.sorted() .filter(task -> task.hasSearchTerm(searchTerm)) .map(task -> (this.tasks.indexOf(task) + 1) + TaskList.TASK_LIST_BULLET_POINT_SEPARATOR + task) .reduce((previousTask, nextTask) @@ -148,7 +155,9 @@ public void showTasksContainingSearchTerm(String searchTerm, MainWindow mainWind * @return the {@code String} representation of the {@code TaskList} object that is suitable for saving to a file */ public String serialise() { + this.tasks.sort(Task::compareTo); return this.tasks.stream() + //.sorted() .map(Task::serialise) .reduce((task1, task2) -> task1 + System.lineSeparator() + task2) diff --git a/src/main/java/bhaymax/task/timesensitive/Deadline.java b/src/main/java/bhaymax/task/timesensitive/Deadline.java index e5f384817f..b82ace9862 100644 --- a/src/main/java/bhaymax/task/timesensitive/Deadline.java +++ b/src/main/java/bhaymax/task/timesensitive/Deadline.java @@ -50,7 +50,8 @@ public class Deadline extends TimeSensitiveTask { */ public Deadline(String description, String dueDateTime) throws DateTimeParseException { - super(Deadline.TYPE, description); + super(Deadline.TYPE, description, + LocalDateTime.parse(dueDateTime, DateTimeFormatter.ofPattern(Parser.DATETIME_INPUT_FORMAT))); this.dueDateTime = LocalDateTime.parse( dueDateTime, DateTimeFormatter.ofPattern(Parser.DATETIME_INPUT_FORMAT)); } diff --git a/src/main/java/bhaymax/task/timesensitive/Event.java b/src/main/java/bhaymax/task/timesensitive/Event.java index 8f43c54b14..2cce30d59c 100644 --- a/src/main/java/bhaymax/task/timesensitive/Event.java +++ b/src/main/java/bhaymax/task/timesensitive/Event.java @@ -7,6 +7,7 @@ import java.util.Scanner; import java.util.regex.MatchResult; +import bhaymax.exception.command.InvalidTimeRangeForEventException; import bhaymax.exception.file.InvalidTaskStatusException; import bhaymax.exception.file.TaskDeSerialisationException; import bhaymax.exception.file.WrongTaskFormatException; @@ -25,7 +26,8 @@ public class Event extends TimeSensitiveTask { // For construction of exception message public static final String START_DATE_INPUT_FORMAT = "{start date: " + Parser.DATETIME_INPUT_FORMAT + "}"; - public static final String END_DATE_INPUT_FORMAT = "{end date: " + Parser.DATETIME_INPUT_FORMAT + "}"; + public static final String END_DATE_INPUT_FORMAT = "{end date (should be after or equal to start date): " + + Parser.DATETIME_INPUT_FORMAT + "}"; private static final String SERIALISATION_FORMAT = "%s " + Task.DELIMITER + " %s " + Task.DELIMITER + " %s"; private static final String DE_SERIALISATION_FORMAT = "^E \\| ([0-1]) \\| (.+)" @@ -55,10 +57,14 @@ public class Event extends TimeSensitiveTask { * @see Parser#DATETIME_INPUT_FORMAT */ public Event(String description, String start, String end) - throws DateTimeParseException { - super(Event.TYPE, description); + throws DateTimeParseException, InvalidTimeRangeForEventException { + super(Event.TYPE, description, + LocalDateTime.parse(start, DateTimeFormatter.ofPattern(Parser.DATETIME_INPUT_FORMAT))); this.start = LocalDateTime.parse(start, DateTimeFormatter.ofPattern(Parser.DATETIME_INPUT_FORMAT)); this.end = LocalDateTime.parse(end, DateTimeFormatter.ofPattern(Parser.DATETIME_INPUT_FORMAT)); + if (this.end.isBefore(this.start)) { + throw new InvalidTimeRangeForEventException(); + } } @Override @@ -103,7 +109,7 @@ private static Event getEvent(int lineNumber, MatchResult matchResult) throws Wr String eventStart = matchResult.group(Event.REGEX_GROUP_START_DATE); String eventEnd = matchResult.group(Event.REGEX_GROUP_END_DATE); event = new Event(eventDescription, eventStart, eventEnd); - } catch (DateTimeParseException e) { + } catch (DateTimeParseException | InvalidTimeRangeForEventException e) { throw new WrongTaskFormatException( lineNumber, Event.NAME, Event.TYPE, Event.START_DATE_INPUT_FORMAT, Event.END_DATE_INPUT_FORMAT); diff --git a/src/main/java/bhaymax/task/timesensitive/TimeSensitiveTask.java b/src/main/java/bhaymax/task/timesensitive/TimeSensitiveTask.java index 308fb8a4fa..4664963bef 100644 --- a/src/main/java/bhaymax/task/timesensitive/TimeSensitiveTask.java +++ b/src/main/java/bhaymax/task/timesensitive/TimeSensitiveTask.java @@ -13,14 +13,17 @@ * An interface for task types that need to track time */ public abstract class TimeSensitiveTask extends Task { + private final LocalDateTime dateTimeUsedForComparison; + /** * Constructor for TimeSensitiveTask objects, meant only for its subclasses * * @param type the type of the task * @param description the description of the task */ - protected TimeSensitiveTask(String type, String description) { + protected TimeSensitiveTask(String type, String description, LocalDateTime dateTimeUsedForComparison) { super(type, description); + this.dateTimeUsedForComparison = dateTimeUsedForComparison; } abstract boolean isBeforeDate(LocalDate date); @@ -35,6 +38,15 @@ protected TimeSensitiveTask(String type, String description) { abstract boolean isOnDateTime(LocalDateTime dateTime); + @Override + public int compareTo(Task task) { + if (!(task instanceof TimeSensitiveTask timeSensitiveTask)) { + return super.compareTo(task); + } + int differenceInTime = this.dateTimeUsedForComparison.compareTo(timeSensitiveTask.dateTimeUsedForComparison); + return (differenceInTime != 0) ? differenceInTime : super.compareTo(task); + } + /** * Checks whether the date(s) of this task matches the provided date filter * From 024381b0f04c7614d77530daa1aa4c47aa9effba Mon Sep 17 00:00:00 2001 From: HarishB99 Date: Tue, 18 Feb 2025 23:56:29 +0800 Subject: [PATCH 2/5] fix: Event.java: Print date and time in output format --- src/main/java/bhaymax/task/timesensitive/Event.java | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/main/java/bhaymax/task/timesensitive/Event.java b/src/main/java/bhaymax/task/timesensitive/Event.java index 2cce30d59c..e5c8d5b671 100644 --- a/src/main/java/bhaymax/task/timesensitive/Event.java +++ b/src/main/java/bhaymax/task/timesensitive/Event.java @@ -140,7 +140,7 @@ private String getStartDateInInputFormat() { } private String getStartDateInOutputFormat() { - return this.start.format(DateTimeFormatter.ofPattern(Parser.DATETIME_INPUT_FORMAT)); + return this.start.format(DateTimeFormatter.ofPattern(Parser.DATETIME_OUTPUT_FORMAT)); } private String getEndDateInInputFormat() { @@ -148,7 +148,7 @@ private String getEndDateInInputFormat() { } private String getEndDateInOutputFormat() { - return this.end.format(DateTimeFormatter.ofPattern(Parser.DATETIME_INPUT_FORMAT)); + return this.end.format(DateTimeFormatter.ofPattern(Parser.DATETIME_OUTPUT_FORMAT)); } @Override From a25cc88104d84fb6d357fa44e8bc3657f82ecba2 Mon Sep 17 00:00:00 2001 From: HarishB99 Date: Wed, 19 Feb 2025 22:21:25 +0800 Subject: [PATCH 3/5] TaskList.java: Remove unused import Comparator --- src/main/java/bhaymax/task/TaskList.java | 1 - 1 file changed, 1 deletion(-) diff --git a/src/main/java/bhaymax/task/TaskList.java b/src/main/java/bhaymax/task/TaskList.java index 1d92206b4a..d9cecc9fc9 100644 --- a/src/main/java/bhaymax/task/TaskList.java +++ b/src/main/java/bhaymax/task/TaskList.java @@ -1,6 +1,5 @@ package bhaymax.task; -import java.util.Comparator; import java.util.LinkedList; import bhaymax.command.FilterOption; From 6f3d1b0e435af9606c5737c1b2fab8da7b60bd3f Mon Sep 17 00:00:00 2001 From: HarishB99 Date: Wed, 19 Feb 2025 23:10:57 +0800 Subject: [PATCH 4/5] Detect and handle attempts to add duplicate tasks --- .../java/bhaymax/command/DeadlineCommand.java | 13 +++++++++++-- src/main/java/bhaymax/command/EventCommand.java | 9 ++++++++- src/main/java/bhaymax/command/TodoCommand.java | 15 +++++++++++++-- .../exception/TaskAlreadyExistsException.java | 16 ++++++++++++++++ .../AttemptToCreateDuplicateTaskException.java | 12 ++++++++++++ .../file/DuplicateTaskInFileException.java | 12 ++++++++++++ src/main/java/bhaymax/storage/Storage.java | 4 ++++ src/main/java/bhaymax/task/Task.java | 6 ++++-- src/main/java/bhaymax/task/TaskList.java | 6 +++++- src/main/java/bhaymax/task/Todo.java | 12 ++++++++++++ .../bhaymax/task/timesensitive/Deadline.java | 12 ++++++++++++ .../java/bhaymax/task/timesensitive/Event.java | 12 ++++++++++++ 12 files changed, 121 insertions(+), 8 deletions(-) create mode 100644 src/main/java/bhaymax/exception/TaskAlreadyExistsException.java create mode 100644 src/main/java/bhaymax/exception/command/AttemptToCreateDuplicateTaskException.java create mode 100644 src/main/java/bhaymax/exception/file/DuplicateTaskInFileException.java diff --git a/src/main/java/bhaymax/command/DeadlineCommand.java b/src/main/java/bhaymax/command/DeadlineCommand.java index ecf3711069..8bace1f115 100644 --- a/src/main/java/bhaymax/command/DeadlineCommand.java +++ b/src/main/java/bhaymax/command/DeadlineCommand.java @@ -1,6 +1,9 @@ package bhaymax.command; import bhaymax.controller.MainWindow; +import bhaymax.exception.TaskAlreadyExistsException; +import bhaymax.exception.command.AttemptToCreateDuplicateTaskException; +import bhaymax.exception.command.InvalidCommandFormatException; import bhaymax.exception.file.FileWriteException; import bhaymax.storage.Storage; import bhaymax.task.TaskList; @@ -31,9 +34,15 @@ public DeadlineCommand(String taskDescription, String deadline) { } @Override - public void execute(TaskList taskList, MainWindow mainWindowController, Storage storage) throws FileWriteException { + public void execute(TaskList taskList, MainWindow mainWindowController, Storage storage) + throws FileWriteException, InvalidCommandFormatException { Deadline newDeadline = new Deadline(this.taskDescription, this.deadline); - int taskListCount = taskList.addTask(newDeadline); + int taskListCount; + try { + taskListCount = taskList.addTask(newDeadline); + } catch (TaskAlreadyExistsException e) { + throw new AttemptToCreateDuplicateTaskException(); + } storage.saveTasks(taskList); String response = String.format( DeadlineCommand.RESPONSE_FORMAT, diff --git a/src/main/java/bhaymax/command/EventCommand.java b/src/main/java/bhaymax/command/EventCommand.java index 77c5735072..0ae902c8c8 100644 --- a/src/main/java/bhaymax/command/EventCommand.java +++ b/src/main/java/bhaymax/command/EventCommand.java @@ -1,6 +1,8 @@ package bhaymax.command; import bhaymax.controller.MainWindow; +import bhaymax.exception.TaskAlreadyExistsException; +import bhaymax.exception.command.AttemptToCreateDuplicateTaskException; import bhaymax.exception.command.InvalidCommandFormatException; import bhaymax.exception.file.FileWriteException; import bhaymax.storage.Storage; @@ -38,7 +40,12 @@ public EventCommand(String taskDescription, String start, String end) { public void execute(TaskList taskList, MainWindow mainWindowController, Storage storage) throws FileWriteException, InvalidCommandFormatException { Event newEvent = new Event(this.taskDescription, this.start, this.end); - int taskListCount = taskList.addTask(newEvent); + int taskListCount; + try { + taskListCount = taskList.addTask(newEvent); + } catch (TaskAlreadyExistsException e) { + throw new AttemptToCreateDuplicateTaskException(); + } storage.saveTasks(taskList); String response = String.format( RESPONSE_FORMAT, diff --git a/src/main/java/bhaymax/command/TodoCommand.java b/src/main/java/bhaymax/command/TodoCommand.java index 1965a0c13b..f0e79c3035 100644 --- a/src/main/java/bhaymax/command/TodoCommand.java +++ b/src/main/java/bhaymax/command/TodoCommand.java @@ -1,6 +1,11 @@ package bhaymax.command; +import com.sun.javafx.tk.Toolkit; + import bhaymax.controller.MainWindow; +import bhaymax.exception.TaskAlreadyExistsException; +import bhaymax.exception.command.AttemptToCreateDuplicateTaskException; +import bhaymax.exception.command.InvalidCommandFormatException; import bhaymax.exception.file.FileWriteException; import bhaymax.storage.Storage; import bhaymax.task.TaskList; @@ -27,9 +32,15 @@ public TodoCommand(String taskDescription) { } @Override - public void execute(TaskList taskList, MainWindow mainWindowController, Storage storage) throws FileWriteException { + public void execute(TaskList taskList, MainWindow mainWindowController, Storage storage) + throws FileWriteException, InvalidCommandFormatException { Todo newTodoTask = new Todo(this.taskDescription); - int taskListCount = taskList.addTask(newTodoTask); + int taskListCount; + try { + taskListCount = taskList.addTask(newTodoTask); + } catch (TaskAlreadyExistsException e) { + throw new AttemptToCreateDuplicateTaskException(); + } storage.saveTasks(taskList); String response = String.format( RESPONSE_FORMAT, diff --git a/src/main/java/bhaymax/exception/TaskAlreadyExistsException.java b/src/main/java/bhaymax/exception/TaskAlreadyExistsException.java new file mode 100644 index 0000000000..2a0e80e5dc --- /dev/null +++ b/src/main/java/bhaymax/exception/TaskAlreadyExistsException.java @@ -0,0 +1,16 @@ +package bhaymax.exception; + +/** + * Thrown when an attempt to add a duplicate task to the tasks list occurs + */ +public class TaskAlreadyExistsException extends RuntimeException { + public static final String ERROR_MESSAGE = "You have already added this task to your list."; + + public TaskAlreadyExistsException() { + super(TaskAlreadyExistsException.ERROR_MESSAGE); + } + + public TaskAlreadyExistsException(String message) { + super(message); + } +} diff --git a/src/main/java/bhaymax/exception/command/AttemptToCreateDuplicateTaskException.java b/src/main/java/bhaymax/exception/command/AttemptToCreateDuplicateTaskException.java new file mode 100644 index 0000000000..e00f2cf32e --- /dev/null +++ b/src/main/java/bhaymax/exception/command/AttemptToCreateDuplicateTaskException.java @@ -0,0 +1,12 @@ +package bhaymax.exception.command; + +import bhaymax.exception.TaskAlreadyExistsException; + +/** + * Thrown when a user attempts to add a task that already exists + */ +public class AttemptToCreateDuplicateTaskException extends InvalidCommandFormatException { + public AttemptToCreateDuplicateTaskException() { + super(TaskAlreadyExistsException.ERROR_MESSAGE); + } +} diff --git a/src/main/java/bhaymax/exception/file/DuplicateTaskInFileException.java b/src/main/java/bhaymax/exception/file/DuplicateTaskInFileException.java new file mode 100644 index 0000000000..efc3640b19 --- /dev/null +++ b/src/main/java/bhaymax/exception/file/DuplicateTaskInFileException.java @@ -0,0 +1,12 @@ +package bhaymax.exception.file; + +/** + * Thrown when there are duplicates in the tasks file + */ +public class DuplicateTaskInFileException extends InvalidFileFormatException { + public static final String ERROR_MESSAGE = "This line has been duplicated at least once."; + + public DuplicateTaskInFileException(int lineNumber) { + super(lineNumber, DuplicateTaskInFileException.ERROR_MESSAGE); + } +} diff --git a/src/main/java/bhaymax/storage/Storage.java b/src/main/java/bhaymax/storage/Storage.java index 6fd4556e0f..451c8a215c 100644 --- a/src/main/java/bhaymax/storage/Storage.java +++ b/src/main/java/bhaymax/storage/Storage.java @@ -9,7 +9,9 @@ import java.util.Optional; import java.util.Scanner; +import bhaymax.exception.TaskAlreadyExistsException; import bhaymax.exception.command.InvalidDateFormatInFileException; +import bhaymax.exception.file.DuplicateTaskInFileException; import bhaymax.exception.file.FileWriteException; import bhaymax.exception.file.InvalidFileFormatException; import bhaymax.exception.file.UnrecognisedTaskTypeException; @@ -94,6 +96,8 @@ public TaskList loadTasks() return taskList; } catch (DateTimeParseException e) { throw new InvalidDateFormatInFileException(lineNumber); + } catch (TaskAlreadyExistsException e) { + throw new DuplicateTaskInFileException(lineNumber); } catch (FileNotFoundException e) { return taskList; } diff --git a/src/main/java/bhaymax/task/Task.java b/src/main/java/bhaymax/task/Task.java index da28d071e6..47ede35a91 100644 --- a/src/main/java/bhaymax/task/Task.java +++ b/src/main/java/bhaymax/task/Task.java @@ -3,7 +3,7 @@ /** * Represents a generic task */ -public class Task implements Comparable { +public abstract class Task implements Comparable { public static final String DELIMITER = "|"; public static final String SERIAL_FORMAT = "%s " + Task.DELIMITER + " %d " + Task.DELIMITER + " %s"; @@ -56,6 +56,8 @@ public String toString() { @Override public int compareTo(Task task) { int differenceInType = this.type.compareTo(task.type); - return (differenceInType != 0) ? differenceInType : this.description.compareTo(task.description); + return (differenceInType != 0) + ? differenceInType + : this.description.toLowerCase().compareTo(task.description.toLowerCase()); } } diff --git a/src/main/java/bhaymax/task/TaskList.java b/src/main/java/bhaymax/task/TaskList.java index d9cecc9fc9..49e1b9e30c 100644 --- a/src/main/java/bhaymax/task/TaskList.java +++ b/src/main/java/bhaymax/task/TaskList.java @@ -4,6 +4,7 @@ import bhaymax.command.FilterOption; import bhaymax.controller.MainWindow; +import bhaymax.exception.TaskAlreadyExistsException; import bhaymax.task.timesensitive.TimeSensitiveTask; import bhaymax.util.Pair; @@ -40,7 +41,10 @@ public boolean isValidIndex(int index) { * @param task an object of {@link Task} type to be added * @return the number of tasks in the list after adding the new task */ - public int addTask(Task task) { + public int addTask(Task task) throws TaskAlreadyExistsException { + if (this.tasks.contains(task)) { + throw new TaskAlreadyExistsException(); + } this.tasks.add(task); return this.tasks.size(); } diff --git a/src/main/java/bhaymax/task/Todo.java b/src/main/java/bhaymax/task/Todo.java index 7a0e4bf62b..d138823871 100644 --- a/src/main/java/bhaymax/task/Todo.java +++ b/src/main/java/bhaymax/task/Todo.java @@ -80,6 +80,18 @@ private static MatchResult getMatchResult(int lineNumber, String serialisedTodo) return matchResult; } + @Override + public boolean equals(Object obj) { + if (this == obj) { + return true; + } + if (obj instanceof Todo todoTask) { + return this.compareTo(todoTask) == 0; + } else { + return false; + } + } + @Override public String toString() { return "[T]" + super.toString(); diff --git a/src/main/java/bhaymax/task/timesensitive/Deadline.java b/src/main/java/bhaymax/task/timesensitive/Deadline.java index b82ace9862..8b8e86940f 100644 --- a/src/main/java/bhaymax/task/timesensitive/Deadline.java +++ b/src/main/java/bhaymax/task/timesensitive/Deadline.java @@ -166,6 +166,18 @@ boolean isOnDateTime(LocalDateTime dateTime) { return this.dueDateTime.isEqual(dateTime); } + @Override + public boolean equals(Object obj) { + if (this == obj) { + return true; + } + if (obj instanceof Deadline deadline) { + return this.compareTo(deadline) == 0; + } else { + return false; + } + } + @Override public String toString() { return "[D]" + super.toString() + " (by: " + this.getDeadlineInOutputFormat() + ")"; diff --git a/src/main/java/bhaymax/task/timesensitive/Event.java b/src/main/java/bhaymax/task/timesensitive/Event.java index e5c8d5b671..0df1bd8d1f 100644 --- a/src/main/java/bhaymax/task/timesensitive/Event.java +++ b/src/main/java/bhaymax/task/timesensitive/Event.java @@ -203,6 +203,18 @@ boolean isOnDateTime(LocalDateTime dateTime) { || this.end.isEqual(dateTime); } + @Override + public boolean equals(Object obj) { + if (this == obj) { + return true; + } + if (obj instanceof Event event) { + return this.compareTo(event) == 0; + } else { + return false; + } + } + @Override public String toString() { return "[E]" + super.toString() + " (from: " From 14d749785c528b33d398b4ecebf47d9fe0207afb Mon Sep 17 00:00:00 2001 From: HarishB99 Date: Wed, 19 Feb 2025 23:13:18 +0800 Subject: [PATCH 5/5] TodoCommand.java: Remove unused import --- src/main/java/bhaymax/command/TodoCommand.java | 2 -- 1 file changed, 2 deletions(-) diff --git a/src/main/java/bhaymax/command/TodoCommand.java b/src/main/java/bhaymax/command/TodoCommand.java index f0e79c3035..3c8620a2b1 100644 --- a/src/main/java/bhaymax/command/TodoCommand.java +++ b/src/main/java/bhaymax/command/TodoCommand.java @@ -1,7 +1,5 @@ package bhaymax.command; -import com.sun.javafx.tk.Toolkit; - import bhaymax.controller.MainWindow; import bhaymax.exception.TaskAlreadyExistsException; import bhaymax.exception.command.AttemptToCreateDuplicateTaskException;