From d9e29842d6a6c9ca54b6d9a8cbe26565717b1aaf Mon Sep 17 00:00:00 2001 From: Charles Goh Date: Wed, 23 Aug 2017 11:32:04 +0800 Subject: [PATCH 01/26] [DS] Changed String references for person to Strings rather than integers --- src/seedu/addressbook/AddressBook.java | 7 ++++--- 1 file changed, 4 insertions(+), 3 deletions(-) diff --git a/src/seedu/addressbook/AddressBook.java b/src/seedu/addressbook/AddressBook.java index 5a158b67..bab1e968 100644 --- a/src/seedu/addressbook/AddressBook.java +++ b/src/seedu/addressbook/AddressBook.java @@ -141,9 +141,10 @@ public class AddressBook { * used by the internal String[] storage format. * For example, a person's name is stored as the 0th element in the array. */ - private static final int PERSON_DATA_INDEX_NAME = 0; - private static final int PERSON_DATA_INDEX_PHONE = 1; - private static final int PERSON_DATA_INDEX_EMAIL = 2; + + private static final String PERSON_PROPERTY_NAME = "name"; + private static final String PERSON_PROPERTY_EMAIL = "email"; + private static final String PERSON_PROPERTY_PHONE = "phone"; /** * The number of data elements for a single person. From 3bcf33722dd353ace46e7bdb1f07b19545241f57 Mon Sep 17 00:00:00 2001 From: Charles Goh Date: Wed, 23 Aug 2017 11:37:51 +0800 Subject: [PATCH 02/26] [PERSON][DS] Changed person from String Array to HashMap --- src/seedu/addressbook/AddressBook.java | 11 ++++++----- 1 file changed, 6 insertions(+), 5 deletions(-) diff --git a/src/seedu/addressbook/AddressBook.java b/src/seedu/addressbook/AddressBook.java index bab1e968..c8b30da6 100644 --- a/src/seedu/addressbook/AddressBook.java +++ b/src/seedu/addressbook/AddressBook.java @@ -22,6 +22,7 @@ import java.util.Optional; import java.util.Scanner; import java.util.Set; +import java.util.HashMap; /* * NOTE : ============================================================= @@ -869,11 +870,11 @@ private static String getEmailFromPerson(String[] person) { * @param email without data prefix * @return constructed person */ - private static String[] makePersonFromData(String name, String phone, String email) { - final String[] person = new String[PERSON_DATA_COUNT]; - person[PERSON_DATA_INDEX_NAME] = name; - person[PERSON_DATA_INDEX_PHONE] = phone; - person[PERSON_DATA_INDEX_EMAIL] = email; + private static HashMap makePersonFromData(String name, String phone, String email) { + final HashMap person = new HashMap (); + person[PERSON_PROPERTY_NAME] = name; + person[PERSON_PROPERTY_PHONE] = phone; + person[PERSON_PROPERTY_EMAIL] = email; return person; } From beb100674e0e5da331b4892417a57dbaf0f468b8 Mon Sep 17 00:00:00 2001 From: Charles Goh Date: Wed, 23 Aug 2017 11:42:00 +0800 Subject: [PATCH 03/26] [PERSON][DS] Replaced String[] person paramters with HashMap equivalent --- src/seedu/addressbook/AddressBook.java | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/src/seedu/addressbook/AddressBook.java b/src/seedu/addressbook/AddressBook.java index c8b30da6..5e724b98 100644 --- a/src/seedu/addressbook/AddressBook.java +++ b/src/seedu/addressbook/AddressBook.java @@ -884,7 +884,7 @@ private static HashMap makePersonFromData(String name, String p * @param person to be encoded * @return encoded string */ - private static String encodePersonToString(String[] person) { + private static String encodePersonToString(HashMap person) { return String.format(PERSON_STRING_REPRESENTATION, getNameFromPerson(person), getPhoneFromPerson(person), getEmailFromPerson(person)); } @@ -897,7 +897,7 @@ private static String encodePersonToString(String[] person) { */ private static ArrayList encodePersonsToStrings(ArrayList persons) { final ArrayList encoded = new ArrayList<>(); - for (String[] person : persons) { + for (HashMap person : persons) { encoded.add(encodePersonToString(person)); } return encoded; @@ -1030,7 +1030,7 @@ private static String extractEmailFromPersonString(String encoded) { * * @param person String array representing the person (used in internal data) */ - private static boolean isPersonDataValid(String[] person) { + private static boolean isPersonDataValid(HashMap person) { return isPersonNameValid(person[PERSON_DATA_INDEX_NAME]) && isPersonPhoneValid(person[PERSON_DATA_INDEX_PHONE]) && isPersonEmailValid(person[PERSON_DATA_INDEX_EMAIL]); From 03d811cea2f4fd0bdd7eca1b980570e9e27acd58 Mon Sep 17 00:00:00 2001 From: Charles Goh Date: Wed, 23 Aug 2017 11:45:49 +0800 Subject: [PATCH 04/26] [PERSON][DS] Changed stray String[] person to HashMap equivalent --- src/seedu/addressbook/AddressBook.java | 16 ++++++++-------- 1 file changed, 8 insertions(+), 8 deletions(-) diff --git a/src/seedu/addressbook/AddressBook.java b/src/seedu/addressbook/AddressBook.java index 5e724b98..28065c9a 100644 --- a/src/seedu/addressbook/AddressBook.java +++ b/src/seedu/addressbook/AddressBook.java @@ -486,7 +486,7 @@ private static Set extractKeywordsFromFindPersonArgs(String findPersonCo */ private static ArrayList getPersonsWithNameContainingAnyKeyword(Collection keywords) { final ArrayList matchedPersons = new ArrayList<>(); - for (String[] person : getAllPersonsInAddressBook()) { + for (HashMap person : getAllPersonsInAddressBook()) { final Set wordsInName = new HashSet<>(splitByWhitespace(getNameFromPerson(person))); if (!Collections.disjoint(wordsInName, keywords)) { matchedPersons.add(person); @@ -643,7 +643,7 @@ private static void showToUser(ArrayList persons) { private static String getDisplayString(ArrayList persons) { final StringBuilder messageAccumulator = new StringBuilder(); for (int i = 0; i < persons.size(); i++) { - final String[] person = persons.get(i); + final HashMap person = persons.get(i); final int displayIndex = i + DISPLAYED_INDEX_OFFSET; messageAccumulator.append('\t') .append(getIndexedPersonListElementMessage(displayIndex, person)) @@ -659,7 +659,7 @@ private static String getDisplayString(ArrayList persons) { * @param person to show * @return formatted listing message with index */ - private static String getIndexedPersonListElementMessage(int visibleIndex, String[] person) { + private static String getIndexedPersonListElementMessage(int visibleIndex, HashMap person) { return String.format(MESSAGE_DISPLAY_LIST_ELEMENT_INDEX, visibleIndex) + getMessageForFormattedPersonData(person); } @@ -669,7 +669,7 @@ private static String getIndexedPersonListElementMessage(int visibleIndex, Strin * @param person to show * @return formatted message showing internal state */ - private static String getMessageForFormattedPersonData(String[] person) { + private static String getMessageForFormattedPersonData(HashMap person) { return String.format(MESSAGE_DISPLAY_PERSON_DATA, getNameFromPerson(person), getPhoneFromPerson(person), getEmailFromPerson(person)); } @@ -784,7 +784,7 @@ private static void savePersonsToFile(ArrayList persons, String filePa * * @param person to add */ - private static void addPersonToAddressBook(String[] person) { + private static void addPersonToAddressBook(HashMap person) { ALL_PERSONS.add(person); savePersonsToFile(getAllPersonsInAddressBook(), storageFilePath); } @@ -840,7 +840,7 @@ private static void initialiseAddressBookModel(ArrayList persons) { * * @param person whose name you want */ - private static String getNameFromPerson(String[] person) { + private static String getNameFromPerson(HashMap person) { return person[PERSON_DATA_INDEX_NAME]; } @@ -849,7 +849,7 @@ private static String getNameFromPerson(String[] person) { * * @param person whose phone number you want */ - private static String getPhoneFromPerson(String[] person) { + private static String getPhoneFromPerson(HashMap person) { return person[PERSON_DATA_INDEX_PHONE]; } @@ -858,7 +858,7 @@ private static String getPhoneFromPerson(String[] person) { * * @param person whose email you want */ - private static String getEmailFromPerson(String[] person) { + private static String getEmailFromPerson(HashMap person) { return person[PERSON_DATA_INDEX_EMAIL]; } From 6be9c03e3906372c83b3e79934a53bb668114b12 Mon Sep 17 00:00:00 2001 From: Charles Goh Date: Wed, 23 Aug 2017 11:47:19 +0800 Subject: [PATCH 05/26] [INDEX][HASH] Changed index to hash property, i.e. DATA_INDEX to PROPERTY --- src/seedu/addressbook/AddressBook.java | 12 ++++++------ 1 file changed, 6 insertions(+), 6 deletions(-) diff --git a/src/seedu/addressbook/AddressBook.java b/src/seedu/addressbook/AddressBook.java index 28065c9a..7f7ca99a 100644 --- a/src/seedu/addressbook/AddressBook.java +++ b/src/seedu/addressbook/AddressBook.java @@ -841,7 +841,7 @@ private static void initialiseAddressBookModel(ArrayList persons) { * @param person whose name you want */ private static String getNameFromPerson(HashMap person) { - return person[PERSON_DATA_INDEX_NAME]; + return person[PERSON_PROPERTY_NAME]; } /** @@ -850,7 +850,7 @@ private static String getNameFromPerson(HashMap person) { * @param person whose phone number you want */ private static String getPhoneFromPerson(HashMap person) { - return person[PERSON_DATA_INDEX_PHONE]; + return person[PERSON_PROPERTY_PHONE]; } /** @@ -859,7 +859,7 @@ private static String getPhoneFromPerson(HashMap person) { * @param person whose email you want */ private static String getEmailFromPerson(HashMap person) { - return person[PERSON_DATA_INDEX_EMAIL]; + return person[PERSON_PROPERTY_EMAIL]; } /** @@ -1031,9 +1031,9 @@ private static String extractEmailFromPersonString(String encoded) { * @param person String array representing the person (used in internal data) */ private static boolean isPersonDataValid(HashMap person) { - return isPersonNameValid(person[PERSON_DATA_INDEX_NAME]) - && isPersonPhoneValid(person[PERSON_DATA_INDEX_PHONE]) - && isPersonEmailValid(person[PERSON_DATA_INDEX_EMAIL]); + return isPersonNameValid(person[PERSON_PROPERTY_NAME]) + && isPersonPhoneValid(person[PERSON_PROPERTY_PHONE]) + && isPersonEmailValid(person[PERSON_PROPERTY_EMAIL]); } /* From c9f49353ddf31a47c214ba3408c85fd98794bc79 Mon Sep 17 00:00:00 2001 From: Charles Goh Date: Wed, 23 Aug 2017 11:53:07 +0800 Subject: [PATCH 06/26] [ALL_PERSONS] Edited ALL_PERSONS generic type to accept HashMap --- src/seedu/addressbook/AddressBook.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/seedu/addressbook/AddressBook.java b/src/seedu/addressbook/AddressBook.java index 7f7ca99a..1f1c9f29 100644 --- a/src/seedu/addressbook/AddressBook.java +++ b/src/seedu/addressbook/AddressBook.java @@ -183,7 +183,7 @@ public class AddressBook { /** * List of all persons in the address book. */ - private static final ArrayList ALL_PERSONS = new ArrayList<>(); + private static final ArrayList> ALL_PERSONS = new ArrayList<>(); /** * Stores the most recent list of persons shown to the user as a result of a user command. From 4258f8f4321037d00b022d058193d337930c3608 Mon Sep 17 00:00:00 2001 From: Charles Goh Date: Wed, 23 Aug 2017 11:57:09 +0800 Subject: [PATCH 07/26] [DEBUG] Changed DS of addedPerson and deletedPerson to accept HashMap param --- src/seedu/addressbook/AddressBook.java | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/seedu/addressbook/AddressBook.java b/src/seedu/addressbook/AddressBook.java index 1f1c9f29..445a6e1c 100644 --- a/src/seedu/addressbook/AddressBook.java +++ b/src/seedu/addressbook/AddressBook.java @@ -439,7 +439,7 @@ private static String executeAddPerson(String commandArgs) { * @param addedPerson person who was successfully added * @return successful add person feedback message */ - private static String getMessageForSuccessfulAddPerson(String[] addedPerson) { + private static String getMessageForSuccessfulAddPerson(HashMap addedPerson) { return String.format(MESSAGE_ADDED, getNameFromPerson(addedPerson), getPhoneFromPerson(addedPerson), getEmailFromPerson(addedPerson)); } @@ -556,7 +556,7 @@ private static boolean isDisplayIndexValidForLastPersonListingView(int index) { * @param deletedPerson successfully deleted * @return successful delete person feedback message */ - private static String getMessageForSuccessfulDelete(String[] deletedPerson) { + private static String getMessageForSuccessfulDelete(HashMap deletedPerson) { return String.format(MESSAGE_DELETE_PERSON_SUCCESS, getMessageForFormattedPersonData(deletedPerson)); } From 13901c68aacc3f51f72e7069a1a87edcac54d0d2 Mon Sep 17 00:00:00 2001 From: Charles Goh Date: Wed, 23 Aug 2017 12:05:49 +0800 Subject: [PATCH 08/26] [FIX][ARRAYLIST][HASHMAP] Changed Arraylist to contain HashMaps intead of String[]s --- src/seedu/addressbook/AddressBook.java | 36 +++++++++++++------------- 1 file changed, 18 insertions(+), 18 deletions(-) diff --git a/src/seedu/addressbook/AddressBook.java b/src/seedu/addressbook/AddressBook.java index 445a6e1c..68c36fea 100644 --- a/src/seedu/addressbook/AddressBook.java +++ b/src/seedu/addressbook/AddressBook.java @@ -190,7 +190,7 @@ public class AddressBook { * This is a subset of the full list. Deleting persons in the pull list does not delete * those persons from this list. */ - private static ArrayList latestPersonListingView = getAllPersonsInAddressBook(); // initial view is of all + private static ArrayList> latestPersonListingView = getAllPersonsInAddressBook(); // initial view is of all /** * The path to the file used for storing person data. @@ -427,7 +427,7 @@ private static String executeAddPerson(String commandArgs) { } // add the person as specified - final String[] personToAdd = decodeResult.get(); + final HashMap personToAdd = decodeResult.get(); addPersonToAddressBook(personToAdd); return getMessageForSuccessfulAddPerson(personToAdd); } @@ -453,7 +453,7 @@ private static String getMessageForSuccessfulAddPerson(HashMap */ private static String executeFindPersons(String commandArgs) { final Set keywords = extractKeywordsFromFindPersonArgs(commandArgs); - final ArrayList personsFound = getPersonsWithNameContainingAnyKeyword(keywords); + final ArrayList> personsFound = getPersonsWithNameContainingAnyKeyword(keywords); showToUser(personsFound); return getMessageForPersonsDisplayedSummary(personsFound); } @@ -464,7 +464,7 @@ private static String executeFindPersons(String commandArgs) { * @param personsDisplayed used to generate summary * @return summary message for persons displayed */ - private static String getMessageForPersonsDisplayedSummary(ArrayList personsDisplayed) { + private static String getMessageForPersonsDisplayedSummary(ArrayList> personsDisplayed) { return String.format(MESSAGE_PERSONS_FOUND_OVERVIEW, personsDisplayed.size()); } @@ -484,8 +484,8 @@ private static Set extractKeywordsFromFindPersonArgs(String findPersonCo * @param keywords for searching * @return list of persons in full model with name containing some of the keywords */ - private static ArrayList getPersonsWithNameContainingAnyKeyword(Collection keywords) { - final ArrayList matchedPersons = new ArrayList<>(); + private static ArrayList> getPersonsWithNameContainingAnyKeyword(Collection keywords) { + final ArrayList> matchedPersons = new ArrayList<>(); for (HashMap person : getAllPersonsInAddressBook()) { final Set wordsInName = new HashSet<>(splitByWhitespace(getNameFromPerson(person))); if (!Collections.disjoint(wordsInName, keywords)) { @@ -576,7 +576,7 @@ private static String executeClearAddressBook() { * @return feedback display message for the operation result */ private static String executeListAllPersonsInAddressBook() { - ArrayList toBeDisplayed = getAllPersonsInAddressBook(); + ArrayList> toBeDisplayed = getAllPersonsInAddressBook(); showToUser(toBeDisplayed); return getMessageForPersonsDisplayedSummary(toBeDisplayed); } @@ -631,7 +631,7 @@ private static void showToUser(String... message) { * The list will be indexed, starting from 1. * */ - private static void showToUser(ArrayList persons) { + private static void showToUser(ArrayList> persons) { String listAsString = getDisplayString(persons); showToUser(listAsString); updateLatestViewedPersonListing(persons); @@ -640,7 +640,7 @@ private static void showToUser(ArrayList persons) { /** * Returns the display string representation of the list of persons. */ - private static String getDisplayString(ArrayList persons) { + private static String getDisplayString(ArrayList> persons) { final StringBuilder messageAccumulator = new StringBuilder(); for (int i = 0; i < persons.size(); i++) { final HashMap person = persons.get(i); @@ -679,7 +679,7 @@ private static String getMessageForFormattedPersonData(HashMap p * * @param newListing the new listing of persons */ - private static void updateLatestViewedPersonListing(ArrayList newListing) { + private static void updateLatestViewedPersonListing(ArrayList> newListing) { // clone to insulate from future changes to arg list latestPersonListingView = new ArrayList<>(newListing); } @@ -730,8 +730,8 @@ private static void createFileIfMissing(String filePath) { * @param filePath file to load from * @return the list of decoded persons */ - private static ArrayList loadPersonsFromFile(String filePath) { - final Optional> successfullyDecoded = decodePersonsFromStrings(getLinesInFile(filePath)); + private static ArrayList> loadPersonsFromFile(String filePath) { + final Optional>> successfullyDecoded = decodePersonsFromStrings(getLinesInFile(filePath)); if (!successfullyDecoded.isPresent()) { showToUser(MESSAGE_INVALID_STORAGE_FILE_CONTENT); exitProgram(); @@ -762,7 +762,7 @@ private static ArrayList getLinesInFile(String filePath) { * * @param filePath file for saving */ - private static void savePersonsToFile(ArrayList persons, String filePath) { + private static void savePersonsToFile(ArrayList> persons, String filePath) { final ArrayList linesToWrite = encodePersonsToStrings(persons); try { Files.write(Paths.get(storageFilePath), linesToWrite); @@ -806,7 +806,7 @@ private static boolean deletePersonFromAddressBook(String[] exactPerson) { /** * Returns all persons in the address book */ - private static ArrayList getAllPersonsInAddressBook() { + private static ArrayList> getAllPersonsInAddressBook() { return ALL_PERSONS; } @@ -823,7 +823,7 @@ private static void clearAddressBook() { * * @param persons list of persons to initialise the model with */ - private static void initialiseAddressBookModel(ArrayList persons) { + private static void initialiseAddressBookModel(ArrayList> persons) { ALL_PERSONS.clear(); ALL_PERSONS.addAll(persons); } @@ -895,7 +895,7 @@ private static String encodePersonToString(HashMap person) { * @param persons to be encoded * @return encoded strings */ - private static ArrayList encodePersonsToStrings(ArrayList persons) { + private static ArrayList encodePersonsToStrings(ArrayList> persons) { final ArrayList encoded = new ArrayList<>(); for (HashMap person : persons) { encoded.add(encodePersonToString(person)); @@ -938,8 +938,8 @@ private static Optional decodePersonFromString(String encoded) { * @return if cannot decode any: empty Optional * else: Optional containing decoded persons */ - private static Optional> decodePersonsFromStrings(ArrayList encodedPersons) { - final ArrayList decodedPersons = new ArrayList<>(); + private static Optional>> decodePersonsFromStrings(ArrayList encodedPersons) { + final ArrayList> decodedPersons = new ArrayList<>(); for (String encodedPerson : encodedPersons) { final Optional decodedPerson = decodePersonFromString(encodedPerson); if (!decodedPerson.isPresent()) { From 35037f2d031b7e0e502344c6bd11625af4c031e1 Mon Sep 17 00:00:00 2001 From: Charles Goh Date: Wed, 23 Aug 2017 12:46:42 +0800 Subject: [PATCH 09/26] [FIX] Fixed data entry to HashMap for makePersonFromData function --- src/seedu/addressbook/AddressBook.java | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/src/seedu/addressbook/AddressBook.java b/src/seedu/addressbook/AddressBook.java index 68c36fea..171aebfe 100644 --- a/src/seedu/addressbook/AddressBook.java +++ b/src/seedu/addressbook/AddressBook.java @@ -872,9 +872,9 @@ private static String getEmailFromPerson(HashMap person) { */ private static HashMap makePersonFromData(String name, String phone, String email) { final HashMap person = new HashMap (); - person[PERSON_PROPERTY_NAME] = name; - person[PERSON_PROPERTY_PHONE] = phone; - person[PERSON_PROPERTY_EMAIL] = email; + person.put(PERSON_PROPERTY_NAME, name); + person.put(PERSON_PROPERTY_EMAIL, email); + person.put(PERSON_PROPERTY_PHONE, phone); return person; } From 69516d727880a05837cbe2677cb8525c2362c1a7 Mon Sep 17 00:00:00 2001 From: Charles Goh Date: Wed, 23 Aug 2017 12:49:46 +0800 Subject: [PATCH 10/26] [FIX] Fixed data retrieval from HashMap in isPersonDataValid function --- src/seedu/addressbook/AddressBook.java | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/src/seedu/addressbook/AddressBook.java b/src/seedu/addressbook/AddressBook.java index 171aebfe..d940448c 100644 --- a/src/seedu/addressbook/AddressBook.java +++ b/src/seedu/addressbook/AddressBook.java @@ -1031,9 +1031,9 @@ private static String extractEmailFromPersonString(String encoded) { * @param person String array representing the person (used in internal data) */ private static boolean isPersonDataValid(HashMap person) { - return isPersonNameValid(person[PERSON_PROPERTY_NAME]) - && isPersonPhoneValid(person[PERSON_PROPERTY_PHONE]) - && isPersonEmailValid(person[PERSON_PROPERTY_EMAIL]); + return isPersonNameValid(person.get(PERSON_PROPERTY_NAME)) + && isPersonPhoneValid(person.get(PERSON_PROPERTY_PHONE)) + && isPersonEmailValid(person.get(PERSON_PROPERTY_EMAIL)); } /* From 78653f69c22a028d6989fca210f7ef964dee2822 Mon Sep 17 00:00:00 2001 From: Charles Goh Date: Wed, 23 Aug 2017 13:27:36 +0800 Subject: [PATCH 11/26] [HASHMAP][GET][FIX] Changed person info getters for HashMap --- src/seedu/addressbook/AddressBook.java | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/src/seedu/addressbook/AddressBook.java b/src/seedu/addressbook/AddressBook.java index d940448c..bb61fb15 100644 --- a/src/seedu/addressbook/AddressBook.java +++ b/src/seedu/addressbook/AddressBook.java @@ -841,7 +841,7 @@ private static void initialiseAddressBookModel(ArrayList * @param person whose name you want */ private static String getNameFromPerson(HashMap person) { - return person[PERSON_PROPERTY_NAME]; + return person.get(PERSON_PROPERTY_NAME); } /** @@ -850,7 +850,7 @@ private static String getNameFromPerson(HashMap person) { * @param person whose phone number you want */ private static String getPhoneFromPerson(HashMap person) { - return person[PERSON_PROPERTY_PHONE]; + return person.get(PERSON_PROPERTY_PHONE); } /** @@ -859,7 +859,7 @@ private static String getPhoneFromPerson(HashMap person) { * @param person whose email you want */ private static String getEmailFromPerson(HashMap person) { - return person[PERSON_PROPERTY_EMAIL]; + return person.get(PERSON_PROPERTY_EMAIL); } /** From 6522a14b4c53b8f9b29b0552d077664ab00cdb46 Mon Sep 17 00:00:00 2001 From: Charles Goh Date: Wed, 23 Aug 2017 14:19:27 +0800 Subject: [PATCH 12/26] [IMPORTS] Imported all of Java Util instead of individual calls --- src/seedu/addressbook/AddressBook.java | 10 +--------- 1 file changed, 1 insertion(+), 9 deletions(-) diff --git a/src/seedu/addressbook/AddressBook.java b/src/seedu/addressbook/AddressBook.java index bb61fb15..966384c1 100644 --- a/src/seedu/addressbook/AddressBook.java +++ b/src/seedu/addressbook/AddressBook.java @@ -14,15 +14,7 @@ import java.nio.file.InvalidPathException; import java.nio.file.Path; import java.nio.file.Paths; -import java.util.ArrayList; -import java.util.Arrays; -import java.util.Collection; -import java.util.Collections; -import java.util.HashSet; -import java.util.Optional; -import java.util.Scanner; -import java.util.Set; -import java.util.HashMap; +import java.util.*; /* * NOTE : ============================================================= From c3c5529bb8ca7c28fe17dc9c78cb7bd3c83b3198 Mon Sep 17 00:00:00 2001 From: Charles Goh Date: Wed, 23 Aug 2017 14:30:24 +0800 Subject: [PATCH 13/26] [FIX][DS] Replaced more ArrayList person calls with HashMap equivalent --- src/seedu/addressbook/AddressBook.java | 14 +++++++------- 1 file changed, 7 insertions(+), 7 deletions(-) diff --git a/src/seedu/addressbook/AddressBook.java b/src/seedu/addressbook/AddressBook.java index 966384c1..4276ad5f 100644 --- a/src/seedu/addressbook/AddressBook.java +++ b/src/seedu/addressbook/AddressBook.java @@ -411,7 +411,7 @@ private static String getMessageForInvalidCommandInput(String userCommand, Strin */ private static String executeAddPerson(String commandArgs) { // try decoding a person from the raw args - final Optional decodeResult = decodePersonFromString(commandArgs); + final Optional> decodeResult = decodePersonFromString(commandArgs); // checks if args are valid (decode result will not be present if the person is invalid) if (!decodeResult.isPresent()) { @@ -501,7 +501,7 @@ private static String executeDeletePerson(String commandArgs) { if (!isDisplayIndexValidForLastPersonListingView(targetVisibleIndex)) { return MESSAGE_INVALID_PERSON_DISPLAYED_INDEX; } - final String[] targetInModel = getPersonByLastVisibleIndex(targetVisibleIndex); + final HashMap targetInModel = getPersonByLastVisibleIndex(targetVisibleIndex); return deletePersonFromAddressBook(targetInModel) ? getMessageForSuccessfulDelete(targetInModel) // success : MESSAGE_PERSON_NOT_IN_ADDRESSBOOK; // not found } @@ -682,7 +682,7 @@ private static void updateLatestViewedPersonListing(ArrayList getPersonByLastVisibleIndex(int lastVisibleIndex) { return latestPersonListingView.get(lastVisibleIndex - DISPLAYED_INDEX_OFFSET); } @@ -787,7 +787,7 @@ private static void addPersonToAddressBook(HashMap person) { * @param exactPerson the actual person inside the address book (exactPerson == the person to delete in the full list) * @return true if the given person was found and deleted in the model */ - private static boolean deletePersonFromAddressBook(String[] exactPerson) { + private static boolean deletePersonFromAddressBook(HashMap exactPerson) { final boolean changed = ALL_PERSONS.remove(exactPerson); if (changed) { savePersonsToFile(getAllPersonsInAddressBook(), storageFilePath); @@ -909,12 +909,12 @@ private static ArrayList encodePersonsToStrings(ArrayList decodePersonFromString(String encoded) { + private static Optional> decodePersonFromString(String encoded) { // check that we can extract the parts of a person from the encoded string if (!isPersonDataExtractableFrom(encoded)) { return Optional.empty(); } - final String[] decodedPerson = makePersonFromData( + final HashMap decodedPerson = makePersonFromData( extractNameFromPersonString(encoded), extractPhoneFromPersonString(encoded), extractEmailFromPersonString(encoded) @@ -933,7 +933,7 @@ private static Optional decodePersonFromString(String encoded) { private static Optional>> decodePersonsFromStrings(ArrayList encodedPersons) { final ArrayList> decodedPersons = new ArrayList<>(); for (String encodedPerson : encodedPersons) { - final Optional decodedPerson = decodePersonFromString(encodedPerson); + final Optional> decodedPerson = decodePersonFromString(encodedPerson); if (!decodedPerson.isPresent()) { return Optional.empty(); } From 8d4ef1bc379fb2474b97aae79b3438417f536d1f Mon Sep 17 00:00:00 2001 From: Charles Goh Date: Wed, 23 Aug 2017 15:04:25 +0800 Subject: [PATCH 14/26] [DEMO][VARARGS] Demoed non varargs showToUser version (commented out) --- src/seedu/addressbook/AddressBook.java | 12 ++++++++++++ 1 file changed, 12 insertions(+) diff --git a/src/seedu/addressbook/AddressBook.java b/src/seedu/addressbook/AddressBook.java index 4276ad5f..bb7db68a 100644 --- a/src/seedu/addressbook/AddressBook.java +++ b/src/seedu/addressbook/AddressBook.java @@ -618,6 +618,18 @@ private static void showToUser(String... message) { } } + /* + private static void showToUser(String[] message) { + for (String m : message) { + System.out.println(LINE_PREFIX + m); + } + } + + private static void showToUser(String message) { + System.out.println(LINE_PREFIX + message); + } + */ + /** * Shows the list of persons to the user. * The list will be indexed, starting from 1. From ae52457c8d5493cec2298b2d3f5002960e269798 Mon Sep 17 00:00:00 2001 From: Charles Goh Date: Sun, 27 Aug 2017 10:44:21 +0800 Subject: [PATCH 15/26] [REFACTOR] Reversed conditional for two functions (loadPersonsFromFile and decodePersonsFromStrings) --- src/seedu/addressbook/AddressBook.java | 26 +++++++++++++------------- 1 file changed, 13 insertions(+), 13 deletions(-) diff --git a/src/seedu/addressbook/AddressBook.java b/src/seedu/addressbook/AddressBook.java index bb7db68a..9433324a 100644 --- a/src/seedu/addressbook/AddressBook.java +++ b/src/seedu/addressbook/AddressBook.java @@ -736,11 +736,11 @@ private static void createFileIfMissing(String filePath) { */ private static ArrayList> loadPersonsFromFile(String filePath) { final Optional>> successfullyDecoded = decodePersonsFromStrings(getLinesInFile(filePath)); - if (!successfullyDecoded.isPresent()) { - showToUser(MESSAGE_INVALID_STORAGE_FILE_CONTENT); - exitProgram(); + if (successfullyDecoded.isPresent()) { + return successfullyDecoded.get(); } - return successfullyDecoded.get(); + showToUser(MESSAGE_INVALID_STORAGE_FILE_CONTENT); + exitProgram(); } /** @@ -923,16 +923,16 @@ private static ArrayList encodePersonsToStrings(ArrayList> decodePersonFromString(String encoded) { // check that we can extract the parts of a person from the encoded string - if (!isPersonDataExtractableFrom(encoded)) { - return Optional.empty(); + if (isPersonDataExtractableFrom(encoded)) { + final HashMap decodedPerson = makePersonFromData( + extractNameFromPersonString(encoded), + extractPhoneFromPersonString(encoded), + extractEmailFromPersonString(encoded) + ); + // check that the constructed person is valid + return isPersonDataValid(decodedPerson) ? Optional.of(decodedPerson) : Optional.empty(); } - final HashMap decodedPerson = makePersonFromData( - extractNameFromPersonString(encoded), - extractPhoneFromPersonString(encoded), - extractEmailFromPersonString(encoded) - ); - // check that the constructed person is valid - return isPersonDataValid(decodedPerson) ? Optional.of(decodedPerson) : Optional.empty(); + return Optional.empty(); } /** From 53d6fddde8a9c92017e69dbdae85171220cbded5 Mon Sep 17 00:00:00 2001 From: Charles Goh Date: Sun, 27 Aug 2017 11:05:46 +0800 Subject: [PATCH 16/26] [REFACTOR] Rolled back decodePersonsFromStrings and replaced hardcoded boolean statements in isPersonDataExtractableFrom --- src/seedu/addressbook/AddressBook.java | 16 +++++++++------- 1 file changed, 9 insertions(+), 7 deletions(-) diff --git a/src/seedu/addressbook/AddressBook.java b/src/seedu/addressbook/AddressBook.java index 9433324a..1a934174 100644 --- a/src/seedu/addressbook/AddressBook.java +++ b/src/seedu/addressbook/AddressBook.java @@ -737,10 +737,10 @@ private static void createFileIfMissing(String filePath) { private static ArrayList> loadPersonsFromFile(String filePath) { final Optional>> successfullyDecoded = decodePersonsFromStrings(getLinesInFile(filePath)); if (successfullyDecoded.isPresent()) { - return successfullyDecoded.get(); + showToUser(MESSAGE_INVALID_STORAGE_FILE_CONTENT); + exitProgram(); } - showToUser(MESSAGE_INVALID_STORAGE_FILE_CONTENT); - exitProgram(); + return successfullyDecoded.get(); } /** @@ -963,10 +963,12 @@ private static Optional>> decodePersonsFromStr private static boolean isPersonDataExtractableFrom(String personData) { final String matchAnyPersonDataPrefix = PERSON_DATA_PREFIX_PHONE + '|' + PERSON_DATA_PREFIX_EMAIL; final String[] splitArgs = personData.trim().split(matchAnyPersonDataPrefix); - return splitArgs.length == 3 // 3 arguments - && !splitArgs[0].isEmpty() // non-empty arguments - && !splitArgs[1].isEmpty() - && !splitArgs[2].isEmpty(); + for (String arg: splitArgs) { + if (arg.isEmpty()) { + return false; + } + } + return splitArgs.length == PERSON_DATA_COUNT; } /** From d44f01df930b4b8a3dbebf05c782763b8e2c7385 Mon Sep 17 00:00:00 2001 From: Charles Goh Date: Sun, 27 Aug 2017 17:50:14 +0800 Subject: [PATCH 17/26] [INDENTATION] Fixed indentation for switch statement --- src/seedu/addressbook/AddressBook.java | 32 +++++++++++++------------- 1 file changed, 16 insertions(+), 16 deletions(-) diff --git a/src/seedu/addressbook/AddressBook.java b/src/seedu/addressbook/AddressBook.java index 1a934174..7aeaf54b 100644 --- a/src/seedu/addressbook/AddressBook.java +++ b/src/seedu/addressbook/AddressBook.java @@ -363,22 +363,22 @@ private static String executeCommand(String userInputString) { final String commandType = commandTypeAndParams[0]; final String commandArgs = commandTypeAndParams[1]; switch (commandType) { - case COMMAND_ADD_WORD: - return executeAddPerson(commandArgs); - case COMMAND_FIND_WORD: - return executeFindPersons(commandArgs); - case COMMAND_LIST_WORD: - return executeListAllPersonsInAddressBook(); - case COMMAND_DELETE_WORD: - return executeDeletePerson(commandArgs); - case COMMAND_CLEAR_WORD: - return executeClearAddressBook(); - case COMMAND_HELP_WORD: - return getUsageInfoForAllCommands(); - case COMMAND_EXIT_WORD: - executeExitProgramRequest(); - default: - return getMessageForInvalidCommandInput(commandType, getUsageInfoForAllCommands()); + case COMMAND_ADD_WORD: + return executeAddPerson(commandArgs); + case COMMAND_FIND_WORD: + return executeFindPersons(commandArgs); + case COMMAND_LIST_WORD: + return executeListAllPersonsInAddressBook(); + case COMMAND_DELETE_WORD: + return executeDeletePerson(commandArgs); + case COMMAND_CLEAR_WORD: + return executeClearAddressBook(); + case COMMAND_HELP_WORD: + return getUsageInfoForAllCommands(); + case COMMAND_EXIT_WORD: + executeExitProgramRequest(); + default: + return getMessageForInvalidCommandInput(commandType, getUsageInfoForAllCommands()); } } From 6a2be7d80227094f373ff5c8724d099ac5b1a042 Mon Sep 17 00:00:00 2001 From: Charles Goh Date: Tue, 29 Aug 2017 09:14:31 +0800 Subject: [PATCH 18/26] [COMMAND][SORT] Set up case and static declarations for sortby command --- src/seedu/addressbook/AddressBook.java | 7 +++++++ 1 file changed, 7 insertions(+) diff --git a/src/seedu/addressbook/AddressBook.java b/src/seedu/addressbook/AddressBook.java index 7aeaf54b..214b61c4 100644 --- a/src/seedu/addressbook/AddressBook.java +++ b/src/seedu/addressbook/AddressBook.java @@ -98,6 +98,11 @@ public class AddressBook { + PERSON_DATA_PREFIX_EMAIL + "EMAIL"; private static final String COMMAND_ADD_EXAMPLE = COMMAND_ADD_WORD + " John Doe p/98765432 e/johnd@gmail.com"; + private static final String COMMAND_SORT_WORD = "sortby"; + private static final String COMMAND_SORT_DESC = "Sorts list of persons from the last find/list call by input field"; + private static final String COMMAND_SORT_PARAMETER = "FIELD" + private static final String COMMAND_SORT_EXAMPLE = COMMAND_SORT_WORD + " NAME"; + private static final String COMMAND_FIND_WORD = "find"; private static final String COMMAND_FIND_DESC = "Finds all persons whose names contain any of the specified " + "keywords (case-sensitive) and displays them as a list with index numbers."; @@ -365,6 +370,8 @@ private static String executeCommand(String userInputString) { switch (commandType) { case COMMAND_ADD_WORD: return executeAddPerson(commandArgs); + case COMMAND_SORT_BY: + return executeSortPerson(commandArgs); case COMMAND_FIND_WORD: return executeFindPersons(commandArgs); case COMMAND_LIST_WORD: From 8772fae2ca5bc1e91dd63d0e54ab81e8a78aaf4b Mon Sep 17 00:00:00 2001 From: Charles Goh Date: Tue, 29 Aug 2017 09:30:31 +0800 Subject: [PATCH 19/26] [COMMAND][SORT] Changed scope setup for sort to name asc and desc only --- src/seedu/addressbook/AddressBook.java | 14 +++++++++++--- 1 file changed, 11 insertions(+), 3 deletions(-) diff --git a/src/seedu/addressbook/AddressBook.java b/src/seedu/addressbook/AddressBook.java index 214b61c4..835022ec 100644 --- a/src/seedu/addressbook/AddressBook.java +++ b/src/seedu/addressbook/AddressBook.java @@ -98,9 +98,9 @@ public class AddressBook { + PERSON_DATA_PREFIX_EMAIL + "EMAIL"; private static final String COMMAND_ADD_EXAMPLE = COMMAND_ADD_WORD + " John Doe p/98765432 e/johnd@gmail.com"; - private static final String COMMAND_SORT_WORD = "sortby"; - private static final String COMMAND_SORT_DESC = "Sorts list of persons from the last find/list call by input field"; - private static final String COMMAND_SORT_PARAMETER = "FIELD" + private static final String COMMAND_SORT_WORD = "sort"; + private static final String COMMAND_SORT_DESC = "Sorts persons from the last find/list call by asc/desc name order"; + private static final String COMMAND_SORT_PARAMETER = "ASC/DESC" private static final String COMMAND_SORT_EXAMPLE = COMMAND_SORT_WORD + " NAME"; private static final String COMMAND_FIND_WORD = "find"; @@ -1098,6 +1098,7 @@ private static boolean isPersonEmailValid(String email) { /** Returns usage info for all commands */ private static String getUsageInfoForAllCommands() { return getUsageInfoForAddCommand() + LS + + getUsageInfoForSortCommand() + LS + getUsageInfoForFindCommand() + LS + getUsageInfoForViewCommand() + LS + getUsageInfoForDeleteCommand() + LS @@ -1113,6 +1114,13 @@ private static String getUsageInfoForAddCommand() { + String.format(MESSAGE_COMMAND_HELP_EXAMPLE, COMMAND_ADD_EXAMPLE) + LS; } + /** Returns the string for showing 'sort' command usage instruction */ + private static String getUsageInfoForSortCommand() { + return String.format(MESSAGE_COMMAND_HELP, COMMAND_SORT_WORD, COMMAND_SORT_DESC) + LS + + String.format(MESSAGE_COMMAND_HELP_PARAMETERS, COMMAND_SORT_PARAMETER) + LS + + String.format(MESSAGE_COMMAND_HELP_EXAMPLE, COMMAND_SORT_EXAMPLE) + LS; + } + /** Returns the string for showing 'find' command usage instruction */ private static String getUsageInfoForFindCommand() { return String.format(MESSAGE_COMMAND_HELP, COMMAND_FIND_WORD, COMMAND_FIND_DESC) + LS From 768790789adeb8a6462d85615eee618f0630191a Mon Sep 17 00:00:00 2001 From: Charles Goh Date: Tue, 29 Aug 2017 09:32:40 +0800 Subject: [PATCH 20/26] [FIX][COMMAND][SORT] Fixed differing static variable --- src/seedu/addressbook/AddressBook.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/seedu/addressbook/AddressBook.java b/src/seedu/addressbook/AddressBook.java index 835022ec..67759209 100644 --- a/src/seedu/addressbook/AddressBook.java +++ b/src/seedu/addressbook/AddressBook.java @@ -370,7 +370,7 @@ private static String executeCommand(String userInputString) { switch (commandType) { case COMMAND_ADD_WORD: return executeAddPerson(commandArgs); - case COMMAND_SORT_BY: + case COMMAND_SORT_WORD: return executeSortPerson(commandArgs); case COMMAND_FIND_WORD: return executeFindPersons(commandArgs); From c8e3030448b0bcf0e372248c176865920deb4373 Mon Sep 17 00:00:00 2001 From: Charles Goh Date: Tue, 29 Aug 2017 11:11:04 +0800 Subject: [PATCH 21/26] [COMMAND][SORTBYNAME] Implemented Brute Force Sort by Name command --- src/seedu/addressbook/AddressBook.java | 36 ++++++++++++++++++++++++-- 1 file changed, 34 insertions(+), 2 deletions(-) diff --git a/src/seedu/addressbook/AddressBook.java b/src/seedu/addressbook/AddressBook.java index 67759209..6731a785 100644 --- a/src/seedu/addressbook/AddressBook.java +++ b/src/seedu/addressbook/AddressBook.java @@ -99,8 +99,8 @@ public class AddressBook { private static final String COMMAND_ADD_EXAMPLE = COMMAND_ADD_WORD + " John Doe p/98765432 e/johnd@gmail.com"; private static final String COMMAND_SORT_WORD = "sort"; - private static final String COMMAND_SORT_DESC = "Sorts persons from the last find/list call by asc/desc name order"; - private static final String COMMAND_SORT_PARAMETER = "ASC/DESC" + private static final String COMMAND_SORT_DESC = "Sorts persons list by asc/desc name order"; + private static final String COMMAND_SORT_PARAMETER = "ASC/DESC"; private static final String COMMAND_SORT_EXAMPLE = COMMAND_SORT_WORD + " NAME"; private static final String COMMAND_FIND_WORD = "find"; @@ -513,6 +513,38 @@ private static String executeDeletePerson(String commandArgs) { : MESSAGE_PERSON_NOT_IN_ADDRESSBOOK; // not found } + /** + * Sorts entries by ascending or descending order by NAME + * + * @param commandArgs full command args string from the user + * @return feedback display message for the operation result + */ + private static String executeSortPerson(String commandArgs) { + ArrayList> targetPersonList = ALL_PERSONS; + + ArrayList personNames = new ArrayList (); + HashMap> bruteHash = new HashMap> (); + for (HashMap person: targetPersonList) { + personNames.add(person.get(PERSON_PROPERTY_NAME)); + bruteHash.put(person.get(PERSON_PROPERTY_NAME), person); + } + + if (commandArgs.equals("ASC")) { + Collections.sort(personNames); + } else if (commandArgs.equals("DESC")) { + Collections.sort(targetPersonList, Collections.reverseOrder()); + } else { + return getMessageForInvalidCommandInput(COMMAND_SORT_WORD, getUsageInfoForSortCommand()); + } + + targetPersonList.clear(); + for (String name: personNames) { + addPersonToAddressBook(bruteHash.get(name)); + } + + return getMessageForPersonsDisplayedSummary(targetPersonList); + } + /** * Checks validity of delete person argument string's format. * From 244667e339d6093cfd368fc63cae3260f8ba8892 Mon Sep 17 00:00:00 2001 From: Charles Goh Date: Tue, 29 Aug 2017 11:12:03 +0800 Subject: [PATCH 22/26] [FIX] Fixed accidental deletion of conditional statement that broke runtime --- src/seedu/addressbook/AddressBook.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/seedu/addressbook/AddressBook.java b/src/seedu/addressbook/AddressBook.java index 6731a785..94e4fe0c 100644 --- a/src/seedu/addressbook/AddressBook.java +++ b/src/seedu/addressbook/AddressBook.java @@ -775,7 +775,7 @@ private static void createFileIfMissing(String filePath) { */ private static ArrayList> loadPersonsFromFile(String filePath) { final Optional>> successfullyDecoded = decodePersonsFromStrings(getLinesInFile(filePath)); - if (successfullyDecoded.isPresent()) { + if (!successfullyDecoded.isPresent()) { showToUser(MESSAGE_INVALID_STORAGE_FILE_CONTENT); exitProgram(); } From b2dd0791dc0cded6b1d438f996576ae8b864a0fb Mon Sep 17 00:00:00 2001 From: Charles Goh Date: Tue, 29 Aug 2017 11:16:26 +0800 Subject: [PATCH 23/26] [FIX][COMMAND][SORTBYNAME] Fixed wrong variable that cause CLI to crash --- src/seedu/addressbook/AddressBook.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/seedu/addressbook/AddressBook.java b/src/seedu/addressbook/AddressBook.java index 94e4fe0c..062989a0 100644 --- a/src/seedu/addressbook/AddressBook.java +++ b/src/seedu/addressbook/AddressBook.java @@ -532,7 +532,7 @@ private static String executeSortPerson(String commandArgs) { if (commandArgs.equals("ASC")) { Collections.sort(personNames); } else if (commandArgs.equals("DESC")) { - Collections.sort(targetPersonList, Collections.reverseOrder()); + Collections.sort(personNames, Collections.reverseOrder()); } else { return getMessageForInvalidCommandInput(COMMAND_SORT_WORD, getUsageInfoForSortCommand()); } From d678c97b3d891b13304817c38eca3aea4adb1093 Mon Sep 17 00:00:00 2001 From: Charles Goh Date: Tue, 29 Aug 2017 23:27:08 +0800 Subject: [PATCH 24/26] [DOCS][COMMAND][SORT] Added documentation for name sort --- README.md | 79 ++++++++++++++++++++++++++++++------------------------- 1 file changed, 43 insertions(+), 36 deletions(-) diff --git a/README.md b/README.md index f1ca56ee..2a49ff20 100644 --- a/README.md +++ b/README.md @@ -1,10 +1,10 @@ # AddressBook (Level 1) -* This is a CLI (Command Line Interface) Address Book application **written in procedural fashion**. -* It is a Java sample application intended for students learning Software Engineering while using Java as - the main programming language. -* It provides a **reasonably well-written** code example that is **significantly bigger** than what students - usually write in data structure modules. -* It can be used to achieve a number of beginner-level [learning outcomes](#learning-outcomes) without +* This is a CLI (Command Line Interface) Address Book application **written in procedural fashion**. +* It is a Java sample application intended for students learning Software Engineering while using Java as + the main programming language. +* It provides a **reasonably well-written** code example that is **significantly bigger** than what students + usually write in data structure modules. +* It can be used to achieve a number of beginner-level [learning outcomes](#learning-outcomes) without running into the complications of OOP or GUI programmings. **Table of Contents** @@ -35,7 +35,7 @@ ----------------------------------------------------------------------------------------------------- # User Guide -This product is not meant for end-users and therefore there is no user-friendly installer. +This product is not meant for end-users and therefore there is no user-friendly installer. Please refer to the [Setting up](#setting-up) section to learn how to set up the project. ## Starting the program @@ -59,9 +59,9 @@ Please refer to the [Setting up](#setting-up) section to learn how to set up the ## List of commands #### Viewing help: `help` -Format: `help` +Format: `help` > Help is also shown if you enter an incorrect command e.g. `abcd` - + #### Adding a person: `add` > Adds a person to the address book @@ -69,43 +69,50 @@ Format: `add NAME p/PHONE_NUMBER e/EMAIL` > Words in `UPPER_CASE` are the parameters
Phone number and email can be in any order but the name must come first. -Examples: +Examples: * `add John Doe p/98765432 e/johnd@gmail.com` * `add Betsy Crowe e/bencrowe@gmail.com p/1234567 ` #### Listing all persons: `list` -> Shows a list of persons, as an indexed list, in the order they were added to the address book, +> Shows a list of persons, as an indexed list, in the order they were added to the address book, oldest first. Format: `list` +#### Sorting all persons by name: `sort` + +> Sorts the list of persons by name, and displays persons +in ascending or descending lexicographical order depending on user input. + +Format: `sort [ASC/DESC]` + #### Finding a person by keyword `find` > Finds persons that match given keywords Format: `find KEYWORD [MORE_KEYWORDS]` -> The search is case sensitive, the order of the keywords does not matter, only the name is searched, +> The search is case sensitive, the order of the keywords does not matter, only the name is searched, and persons matching at least one keyword will be returned (i.e. `OR` search). -Examples: +Examples: * `find John` > Returns `John Doe` but not `john` - + * `find Betsy Tim John` > Returns Any person having names `Betsy`, `Tim`, or `John` #### Deleting a person: `delete` Format: `delete INDEX` -> Deletes the person at the specified `INDEX`. +> Deletes the person at the specified `INDEX`. The index refers to the index numbers shown in the most recent listing. -Examples: +Examples: * `list`
`delete 2` > Deletes the 2nd person in the address book. - -* `find Betsy`
+ +* `find Betsy`
`delete 1` > Deletes the 1st person in the results of the `find` command. @@ -116,8 +123,8 @@ Format: `clear` #### Exiting the program: `exit` Format: `exit` -#### Saving the data -Address book data are saved in the hard disk automatically after any command that changes the data. +#### Saving the data +Address book data are saved in the hard disk automatically after any command that changes the data. There is no need to save manually. #### Changing the save location @@ -144,7 +151,7 @@ Example: **Prerequisites** -* JDK 8 or later +* JDK 8 or later * IntelliJ IDE **Importing the project into IntelliJ** @@ -181,14 +188,14 @@ In-memory data are held in a `ArrayList` where each `String[]` object 1. Open a DOS window in the `test` folder 2. Run the `runtests.bat` script -3. If the script reports that there is no difference between `actual.txt` and `expected.txt`, +3. If the script reports that there is no difference between `actual.txt` and `expected.txt`, the test has passed. **Mac/Unix/Linux** 1. Open a terminal window in the `test` folder 2. Run the `runtests.sh` script -3. If the script reports that there is no difference between `actual.txt` and `expected.txt`, +3. If the script reports that there is no difference between `actual.txt` and `expected.txt`, the test has passed. **Troubleshooting test failures** @@ -211,7 +218,7 @@ corresponding exercises. * Learn [how to set up a project in IntelliJ](https://se-edu.github.io/se-book/intellij/projectSetup/). -#### Exercise: Setup project in IntelliJ +#### Exercise: Setup project in IntelliJ Part A: * Create a new project in IntelliJ and write a small HelloWorld program. @@ -226,10 +233,10 @@ Part B: ## Navigate code efficiently `[LO-CodeNavigation]` -The `AddressBook.java` code is rather long, which makes it cumbersome to navigate by scrolling alone. -Navigating code using IDE shortcuts is a more efficient option. +The `AddressBook.java` code is rather long, which makes it cumbersome to navigate by scrolling alone. +Navigating code using IDE shortcuts is a more efficient option. For example, CTRL+B will navigate to the definition of the method/field at the cursor. - + Learn [basic IntelliJ code navigation features](https://se-edu.github.io/se-book/intellij/codeNavigation/). #### Exercise: Learn to navigate code using shortcuts @@ -244,7 +251,7 @@ Learn [basic IntelliJ debugging features](https://se-edu.github.io/se-book/intel Prerequisite: `[LO-IdeSetup]` -Demonstrate your debugging skills using the AddressBook code. +Demonstrate your debugging skills using the AddressBook code. Here are some things you can do in your demonstration: @@ -262,7 +269,7 @@ Learn [how to automate testing of CLIs](https://se-edu.github.io/se-book/testing * Run the tests as explained in the [Testing](#testing) section. * Examine the test script to understand how the script works. -* Add a few more tests to the `input.txt`. Run the tests. It should fail.
+* Add a few more tests to the `input.txt`. Run the tests. It should fail.
Modify `expected.txt` to make the tests pass again. * Edit the `AddressBook.java` to modify the behavior slightly and modify tests to match. @@ -314,7 +321,7 @@ Compare the code with and without the varargs feature. ## Follow a coding standard `[LO-CodingStandard]` -The given code follows the [coding standard][coding-standard] +The given code follows the [coding standard][coding-standard] for the most part. This learning outcome is covered by the exercise in `[LO-Refactor]`. @@ -376,12 +383,12 @@ A well-abstracted method should do only one thing. While it is short, there are some problems with how it has been abstracted. 1. It contains the term `sign` which is not a term used by the AddressBook vocabulary. - + > **A method adds a new term to the vocabulary used to express the solution**. > Therefore, it is not good when a method name contains terms that are not strictly necessary to express the > solution (e.g. there is another term already used to express the same thing) or not in tune with the solution > (e.g. it does not go well with the other terms already used). - + 2. Its implementation is not doing exactly what is advertised by the method name and the header comment. For example, the code does not remove only prefixes; it removes `sign` from anywhere in the `s`. 3. The method can be _more general_ and _more independent_ from the rest of the code. For example, @@ -394,7 +401,7 @@ While it is short, there are some problems with how it has been abstracted. */ private static String removePrefix(String fullString, String prefix) { ... } ``` - + If needed, a more AddressBook-specific method that works on parameter strings only can be defined. In that case, that method can make use of the more general method suggested above. @@ -432,11 +439,11 @@ readability. #### Exercise 2: Refactor the code to make it worse! -Sometimes, going in the wrong direction can be a good learning experience too. +Sometimes, going in the wrong direction can be a good learning experience too. In this exercise, we explore how low code qualities can go. * Refactor the code to make the code as bad as possible.
- i.e. How bad can you make it without breaking the functionality while still making it look like it was written by a + i.e. How bad can you make it without breaking the functionality while still making it look like it was written by a programmer (but a very bad programmer :-)). * In particular, inlining methods can worsen the code quality fast. @@ -468,4 +475,4 @@ The full list of contributors for se-edu can be found [here](https://se-edu.gith * If you would like to contact us, refer to [our website](https://se-edu.github.io/#contact). [coding-standard]: https://github.com/oss-generic/process/blob/master/codingStandards/CodingStandard-Java.md "Java Coding Standard" -[code-quality]: https://se-edu.github.io/se-book/codeQuality/ "Code Quality Best Practices" \ No newline at end of file +[code-quality]: https://se-edu.github.io/se-book/codeQuality/ "Code Quality Best Practices" From 316a8f7b8ababa5029c6b25ef77e3d5c34f90c4c Mon Sep 17 00:00:00 2001 From: Charles Goh Date: Wed, 30 Aug 2017 09:34:16 +0800 Subject: [PATCH 25/26] [FIX][COMMAND][SORT] Fixed COMMAND_SORT_EXAMPLE constant variable --- src/seedu/addressbook/AddressBook.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/seedu/addressbook/AddressBook.java b/src/seedu/addressbook/AddressBook.java index 062989a0..00352aaa 100644 --- a/src/seedu/addressbook/AddressBook.java +++ b/src/seedu/addressbook/AddressBook.java @@ -101,7 +101,7 @@ public class AddressBook { private static final String COMMAND_SORT_WORD = "sort"; private static final String COMMAND_SORT_DESC = "Sorts persons list by asc/desc name order"; private static final String COMMAND_SORT_PARAMETER = "ASC/DESC"; - private static final String COMMAND_SORT_EXAMPLE = COMMAND_SORT_WORD + " NAME"; + private static final String COMMAND_SORT_EXAMPLE = COMMAND_SORT_WORD + " ASC/DESC"; private static final String COMMAND_FIND_WORD = "find"; private static final String COMMAND_FIND_DESC = "Finds all persons whose names contain any of the specified " From f9baf8c2cb348f536a3eb7ed530386e7deed6a76 Mon Sep 17 00:00:00 2001 From: Charles Goh Date: Sun, 3 Sep 2017 15:56:49 +0800 Subject: [PATCH 26/26] [LO-Enums] Swapped static variables with usage of Enums for Hashmap --- src/seedu/addressbook/AddressBook.java | 121 +++++++++++++------------ 1 file changed, 63 insertions(+), 58 deletions(-) diff --git a/src/seedu/addressbook/AddressBook.java b/src/seedu/addressbook/AddressBook.java index 00352aaa..9b394b32 100644 --- a/src/seedu/addressbook/AddressBook.java +++ b/src/seedu/addressbook/AddressBook.java @@ -140,9 +140,14 @@ public class AddressBook { * For example, a person's name is stored as the 0th element in the array. */ - private static final String PERSON_PROPERTY_NAME = "name"; - private static final String PERSON_PROPERTY_EMAIL = "email"; - private static final String PERSON_PROPERTY_PHONE = "phone"; +// private static final String PERSON_PROPERTY_NAME = "name"; +// private static final String PERSON_PROPERTY_EMAIL = "email"; +// private static final String PERSON_PROPERTY_PHONE = "phone"; + + // Replaces PERSON_PROPERTY_ with enums variant + private enum PersonProperty { + NAME, EMAIL, PHONE + }; /** * The number of data elements for a single person. @@ -180,14 +185,14 @@ public class AddressBook { /** * List of all persons in the address book. */ - private static final ArrayList> ALL_PERSONS = new ArrayList<>(); + private static final ArrayList> ALL_PERSONS = new ArrayList<>(); /** * Stores the most recent list of persons shown to the user as a result of a user command. * This is a subset of the full list. Deleting persons in the pull list does not delete * those persons from this list. */ - private static ArrayList> latestPersonListingView = getAllPersonsInAddressBook(); // initial view is of all + private static ArrayList> latestPersonListingView = getAllPersonsInAddressBook(); // initial view is of all /** * The path to the file used for storing person data. @@ -418,7 +423,7 @@ private static String getMessageForInvalidCommandInput(String userCommand, Strin */ private static String executeAddPerson(String commandArgs) { // try decoding a person from the raw args - final Optional> decodeResult = decodePersonFromString(commandArgs); + final Optional> decodeResult = decodePersonFromString(commandArgs); // checks if args are valid (decode result will not be present if the person is invalid) if (!decodeResult.isPresent()) { @@ -426,7 +431,7 @@ private static String executeAddPerson(String commandArgs) { } // add the person as specified - final HashMap personToAdd = decodeResult.get(); + final HashMap personToAdd = decodeResult.get(); addPersonToAddressBook(personToAdd); return getMessageForSuccessfulAddPerson(personToAdd); } @@ -438,7 +443,7 @@ private static String executeAddPerson(String commandArgs) { * @param addedPerson person who was successfully added * @return successful add person feedback message */ - private static String getMessageForSuccessfulAddPerson(HashMap addedPerson) { + private static String getMessageForSuccessfulAddPerson(HashMap addedPerson) { return String.format(MESSAGE_ADDED, getNameFromPerson(addedPerson), getPhoneFromPerson(addedPerson), getEmailFromPerson(addedPerson)); } @@ -452,7 +457,7 @@ private static String getMessageForSuccessfulAddPerson(HashMap */ private static String executeFindPersons(String commandArgs) { final Set keywords = extractKeywordsFromFindPersonArgs(commandArgs); - final ArrayList> personsFound = getPersonsWithNameContainingAnyKeyword(keywords); + final ArrayList> personsFound = getPersonsWithNameContainingAnyKeyword(keywords); showToUser(personsFound); return getMessageForPersonsDisplayedSummary(personsFound); } @@ -463,7 +468,7 @@ private static String executeFindPersons(String commandArgs) { * @param personsDisplayed used to generate summary * @return summary message for persons displayed */ - private static String getMessageForPersonsDisplayedSummary(ArrayList> personsDisplayed) { + private static String getMessageForPersonsDisplayedSummary(ArrayList> personsDisplayed) { return String.format(MESSAGE_PERSONS_FOUND_OVERVIEW, personsDisplayed.size()); } @@ -483,9 +488,9 @@ private static Set extractKeywordsFromFindPersonArgs(String findPersonCo * @param keywords for searching * @return list of persons in full model with name containing some of the keywords */ - private static ArrayList> getPersonsWithNameContainingAnyKeyword(Collection keywords) { - final ArrayList> matchedPersons = new ArrayList<>(); - for (HashMap person : getAllPersonsInAddressBook()) { + private static ArrayList> getPersonsWithNameContainingAnyKeyword(Collection keywords) { + final ArrayList> matchedPersons = new ArrayList<>(); + for (HashMap person : getAllPersonsInAddressBook()) { final Set wordsInName = new HashSet<>(splitByWhitespace(getNameFromPerson(person))); if (!Collections.disjoint(wordsInName, keywords)) { matchedPersons.add(person); @@ -508,7 +513,7 @@ private static String executeDeletePerson(String commandArgs) { if (!isDisplayIndexValidForLastPersonListingView(targetVisibleIndex)) { return MESSAGE_INVALID_PERSON_DISPLAYED_INDEX; } - final HashMap targetInModel = getPersonByLastVisibleIndex(targetVisibleIndex); + final HashMap targetInModel = getPersonByLastVisibleIndex(targetVisibleIndex); return deletePersonFromAddressBook(targetInModel) ? getMessageForSuccessfulDelete(targetInModel) // success : MESSAGE_PERSON_NOT_IN_ADDRESSBOOK; // not found } @@ -520,13 +525,13 @@ private static String executeDeletePerson(String commandArgs) { * @return feedback display message for the operation result */ private static String executeSortPerson(String commandArgs) { - ArrayList> targetPersonList = ALL_PERSONS; + ArrayList> targetPersonList = ALL_PERSONS; ArrayList personNames = new ArrayList (); - HashMap> bruteHash = new HashMap> (); - for (HashMap person: targetPersonList) { - personNames.add(person.get(PERSON_PROPERTY_NAME)); - bruteHash.put(person.get(PERSON_PROPERTY_NAME), person); + HashMap> bruteHash = new HashMap> (); + for (HashMap person: targetPersonList) { + personNames.add(person.get(PersonProperty.NAME)); + bruteHash.put(person.get(PersonProperty.NAME), person); } if (commandArgs.equals("ASC")) { @@ -587,7 +592,7 @@ private static boolean isDisplayIndexValidForLastPersonListingView(int index) { * @param deletedPerson successfully deleted * @return successful delete person feedback message */ - private static String getMessageForSuccessfulDelete(HashMap deletedPerson) { + private static String getMessageForSuccessfulDelete(HashMap deletedPerson) { return String.format(MESSAGE_DELETE_PERSON_SUCCESS, getMessageForFormattedPersonData(deletedPerson)); } @@ -607,7 +612,7 @@ private static String executeClearAddressBook() { * @return feedback display message for the operation result */ private static String executeListAllPersonsInAddressBook() { - ArrayList> toBeDisplayed = getAllPersonsInAddressBook(); + ArrayList> toBeDisplayed = getAllPersonsInAddressBook(); showToUser(toBeDisplayed); return getMessageForPersonsDisplayedSummary(toBeDisplayed); } @@ -674,7 +679,7 @@ private static void showToUser(String message) { * The list will be indexed, starting from 1. * */ - private static void showToUser(ArrayList> persons) { + private static void showToUser(ArrayList> persons) { String listAsString = getDisplayString(persons); showToUser(listAsString); updateLatestViewedPersonListing(persons); @@ -683,10 +688,10 @@ private static void showToUser(ArrayList> persons) { /** * Returns the display string representation of the list of persons. */ - private static String getDisplayString(ArrayList> persons) { + private static String getDisplayString(ArrayList> persons) { final StringBuilder messageAccumulator = new StringBuilder(); for (int i = 0; i < persons.size(); i++) { - final HashMap person = persons.get(i); + final HashMap person = persons.get(i); final int displayIndex = i + DISPLAYED_INDEX_OFFSET; messageAccumulator.append('\t') .append(getIndexedPersonListElementMessage(displayIndex, person)) @@ -702,7 +707,7 @@ private static String getDisplayString(ArrayList> person * @param person to show * @return formatted listing message with index */ - private static String getIndexedPersonListElementMessage(int visibleIndex, HashMap person) { + private static String getIndexedPersonListElementMessage(int visibleIndex, HashMap person) { return String.format(MESSAGE_DISPLAY_LIST_ELEMENT_INDEX, visibleIndex) + getMessageForFormattedPersonData(person); } @@ -712,7 +717,7 @@ private static String getIndexedPersonListElementMessage(int visibleIndex, HashM * @param person to show * @return formatted message showing internal state */ - private static String getMessageForFormattedPersonData(HashMap person) { + private static String getMessageForFormattedPersonData(HashMap person) { return String.format(MESSAGE_DISPLAY_PERSON_DATA, getNameFromPerson(person), getPhoneFromPerson(person), getEmailFromPerson(person)); } @@ -722,7 +727,7 @@ private static String getMessageForFormattedPersonData(HashMap p * * @param newListing the new listing of persons */ - private static void updateLatestViewedPersonListing(ArrayList> newListing) { + private static void updateLatestViewedPersonListing(ArrayList> newListing) { // clone to insulate from future changes to arg list latestPersonListingView = new ArrayList<>(newListing); } @@ -733,7 +738,7 @@ private static void updateLatestViewedPersonListing(ArrayList getPersonByLastVisibleIndex(int lastVisibleIndex) { + private static HashMap getPersonByLastVisibleIndex(int lastVisibleIndex) { return latestPersonListingView.get(lastVisibleIndex - DISPLAYED_INDEX_OFFSET); } @@ -773,8 +778,8 @@ private static void createFileIfMissing(String filePath) { * @param filePath file to load from * @return the list of decoded persons */ - private static ArrayList> loadPersonsFromFile(String filePath) { - final Optional>> successfullyDecoded = decodePersonsFromStrings(getLinesInFile(filePath)); + private static ArrayList> loadPersonsFromFile(String filePath) { + final Optional>> successfullyDecoded = decodePersonsFromStrings(getLinesInFile(filePath)); if (!successfullyDecoded.isPresent()) { showToUser(MESSAGE_INVALID_STORAGE_FILE_CONTENT); exitProgram(); @@ -805,7 +810,7 @@ private static ArrayList getLinesInFile(String filePath) { * * @param filePath file for saving */ - private static void savePersonsToFile(ArrayList> persons, String filePath) { + private static void savePersonsToFile(ArrayList> persons, String filePath) { final ArrayList linesToWrite = encodePersonsToStrings(persons); try { Files.write(Paths.get(storageFilePath), linesToWrite); @@ -827,7 +832,7 @@ private static void savePersonsToFile(ArrayList> persons * * @param person to add */ - private static void addPersonToAddressBook(HashMap person) { + private static void addPersonToAddressBook(HashMap person) { ALL_PERSONS.add(person); savePersonsToFile(getAllPersonsInAddressBook(), storageFilePath); } @@ -838,7 +843,7 @@ private static void addPersonToAddressBook(HashMap person) { * @param exactPerson the actual person inside the address book (exactPerson == the person to delete in the full list) * @return true if the given person was found and deleted in the model */ - private static boolean deletePersonFromAddressBook(HashMap exactPerson) { + private static boolean deletePersonFromAddressBook(HashMap exactPerson) { final boolean changed = ALL_PERSONS.remove(exactPerson); if (changed) { savePersonsToFile(getAllPersonsInAddressBook(), storageFilePath); @@ -849,7 +854,7 @@ private static boolean deletePersonFromAddressBook(HashMap exact /** * Returns all persons in the address book */ - private static ArrayList> getAllPersonsInAddressBook() { + private static ArrayList> getAllPersonsInAddressBook() { return ALL_PERSONS; } @@ -866,7 +871,7 @@ private static void clearAddressBook() { * * @param persons list of persons to initialise the model with */ - private static void initialiseAddressBookModel(ArrayList> persons) { + private static void initialiseAddressBookModel(ArrayList> persons) { ALL_PERSONS.clear(); ALL_PERSONS.addAll(persons); } @@ -883,8 +888,8 @@ private static void initialiseAddressBookModel(ArrayList * * @param person whose name you want */ - private static String getNameFromPerson(HashMap person) { - return person.get(PERSON_PROPERTY_NAME); + private static String getNameFromPerson(HashMap person) { + return person.get(PersonProperty.NAME); } /** @@ -892,8 +897,8 @@ private static String getNameFromPerson(HashMap person) { * * @param person whose phone number you want */ - private static String getPhoneFromPerson(HashMap person) { - return person.get(PERSON_PROPERTY_PHONE); + private static String getPhoneFromPerson(HashMap person) { + return person.get(PersonProperty.PHONE); } /** @@ -901,8 +906,8 @@ private static String getPhoneFromPerson(HashMap person) { * * @param person whose email you want */ - private static String getEmailFromPerson(HashMap person) { - return person.get(PERSON_PROPERTY_EMAIL); + private static String getEmailFromPerson(HashMap person) { + return person.get(PersonProperty.EMAIL); } /** @@ -913,11 +918,11 @@ private static String getEmailFromPerson(HashMap person) { * @param email without data prefix * @return constructed person */ - private static HashMap makePersonFromData(String name, String phone, String email) { - final HashMap person = new HashMap (); - person.put(PERSON_PROPERTY_NAME, name); - person.put(PERSON_PROPERTY_EMAIL, email); - person.put(PERSON_PROPERTY_PHONE, phone); + private static HashMap makePersonFromData(String name, String phone, String email) { + final HashMap person = new HashMap (); + person.put(PersonProperty.NAME, name); + person.put(PersonProperty.EMAIL, email); + person.put(PersonProperty.PHONE, phone); return person; } @@ -927,7 +932,7 @@ private static HashMap makePersonFromData(String name, String p * @param person to be encoded * @return encoded string */ - private static String encodePersonToString(HashMap person) { + private static String encodePersonToString(HashMap person) { return String.format(PERSON_STRING_REPRESENTATION, getNameFromPerson(person), getPhoneFromPerson(person), getEmailFromPerson(person)); } @@ -938,9 +943,9 @@ private static String encodePersonToString(HashMap person) { * @param persons to be encoded * @return encoded strings */ - private static ArrayList encodePersonsToStrings(ArrayList> persons) { + private static ArrayList encodePersonsToStrings(ArrayList> persons) { final ArrayList encoded = new ArrayList<>(); - for (HashMap person : persons) { + for (HashMap person : persons) { encoded.add(encodePersonToString(person)); } return encoded; @@ -960,10 +965,10 @@ private static ArrayList encodePersonsToStrings(ArrayList> decodePersonFromString(String encoded) { + private static Optional> decodePersonFromString(String encoded) { // check that we can extract the parts of a person from the encoded string if (isPersonDataExtractableFrom(encoded)) { - final HashMap decodedPerson = makePersonFromData( + final HashMap decodedPerson = makePersonFromData( extractNameFromPersonString(encoded), extractPhoneFromPersonString(encoded), extractEmailFromPersonString(encoded) @@ -981,10 +986,10 @@ private static Optional> decodePersonFromString(String e * @return if cannot decode any: empty Optional * else: Optional containing decoded persons */ - private static Optional>> decodePersonsFromStrings(ArrayList encodedPersons) { - final ArrayList> decodedPersons = new ArrayList<>(); + private static Optional>> decodePersonsFromStrings(ArrayList encodedPersons) { + final ArrayList> decodedPersons = new ArrayList<>(); for (String encodedPerson : encodedPersons) { - final Optional> decodedPerson = decodePersonFromString(encodedPerson); + final Optional> decodedPerson = decodePersonFromString(encodedPerson); if (!decodedPerson.isPresent()) { return Optional.empty(); } @@ -1075,10 +1080,10 @@ private static String extractEmailFromPersonString(String encoded) { * * @param person String array representing the person (used in internal data) */ - private static boolean isPersonDataValid(HashMap person) { - return isPersonNameValid(person.get(PERSON_PROPERTY_NAME)) - && isPersonPhoneValid(person.get(PERSON_PROPERTY_PHONE)) - && isPersonEmailValid(person.get(PERSON_PROPERTY_EMAIL)); + private static boolean isPersonDataValid(HashMap person) { + return isPersonNameValid(person.get(PersonProperty.NAME)) + && isPersonPhoneValid(person.get(PersonProperty.PHONE)) + && isPersonEmailValid(person.get(PersonProperty.EMAIL)); } /*