Skip to content

Commit 6227a24

Browse files
authored
Merge pull request nus-cs2103-AY2021S1#108 from chrystalquek/autosort-person-list
Autosort person list
2 parents 4e4d5cd + 27de31f commit 6227a24

File tree

7 files changed

+138
-1
lines changed

7 files changed

+138
-1
lines changed

src/main/java/seedu/address/model/person/AddressBook.java

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -37,6 +37,13 @@ public AddressBook(ReadOnlyAddressBook toBeCopied) {
3737
resetData(toBeCopied);
3838
}
3939

40+
/**
41+
* Sorts the content of the contact list by Name in ascending order.
42+
*/
43+
public void sortContacts() {
44+
persons.sortList();
45+
}
46+
4047
//// list overwrite operations
4148

4249
/**

src/main/java/seedu/address/model/person/person/Name.java

Lines changed: 6 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -7,7 +7,7 @@
77
* Represents a Person's name in the address book.
88
* Guarantees: immutable; is valid as declared in {@link #isValidName(String)}
99
*/
10-
public class Name {
10+
public class Name implements Comparable<Name> {
1111

1212
public static final String MESSAGE_CONSTRAINTS =
1313
"Names should only contain alphanumeric characters and spaces, and it should not be blank";
@@ -56,4 +56,9 @@ public int hashCode() {
5656
return fullName.hashCode();
5757
}
5858

59+
@Override
60+
public int compareTo(Name name) {
61+
requireNonNull(name);
62+
return fullName.compareTo(name.fullName);
63+
}
5964
}

src/main/java/seedu/address/model/person/person/UniquePersonList.java

Lines changed: 16 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -3,13 +3,15 @@
33
import static java.util.Objects.requireNonNull;
44
import static seedu.address.commons.util.CollectionUtil.requireAllNonNull;
55

6+
import java.util.Collections;
67
import java.util.Iterator;
78
import java.util.List;
89

910
import javafx.collections.FXCollections;
1011
import javafx.collections.ObservableList;
1112
import seedu.address.model.person.person.exceptions.DuplicatePersonException;
1213
import seedu.address.model.person.person.exceptions.PersonNotFoundException;
14+
import seedu.address.model.person.util.PersonComparator;
1315

1416
/**
1517
* A list of persons that enforces uniqueness between its elements and does not allow nulls.
@@ -27,6 +29,7 @@ public class UniquePersonList implements Iterable<Person> {
2729
private final ObservableList<Person> internalList = FXCollections.observableArrayList();
2830
private final ObservableList<Person> internalUnmodifiableList =
2931
FXCollections.unmodifiableObservableList(internalList);
32+
private final PersonComparator personComparator = new PersonComparator();
3033

3134
/**
3235
* Returns true if the list contains an equivalent person as the given argument.
@@ -46,6 +49,7 @@ public void add(Person toAdd) {
4649
throw new DuplicatePersonException();
4750
}
4851
internalList.add(toAdd);
52+
sortList();
4953
}
5054

5155
/**
@@ -66,6 +70,7 @@ public void setPerson(Person target, Person editedPerson) {
6670
}
6771

6872
internalList.set(index, editedPerson);
73+
sortList();
6974
}
7075

7176
/**
@@ -82,6 +87,7 @@ public void remove(Person toRemove) {
8287
public void setPersons(UniquePersonList replacement) {
8388
requireNonNull(replacement);
8489
internalList.setAll(replacement.internalList);
90+
sortList();
8591
}
8692

8793
/**
@@ -95,6 +101,7 @@ public void setPersons(List<Person> persons) {
95101
}
96102

97103
internalList.setAll(persons);
104+
sortList();
98105
}
99106

100107
/**
@@ -104,8 +111,17 @@ public ObservableList<Person> asUnmodifiableObservableList() {
104111
return internalUnmodifiableList;
105112
}
106113

114+
/**
115+
* Sort the list by Name's value
116+
*
117+
*/
118+
public void sortList() {
119+
Collections.sort(internalList, personComparator);
120+
}
121+
107122
@Override
108123
public Iterator<Person> iterator() {
124+
sortList();
109125
return internalList.iterator();
110126
}
111127

Lines changed: 24 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,24 @@
1+
package seedu.address.model.person.util;
2+
3+
import static seedu.address.commons.util.CollectionUtil.requireAllNonNull;
4+
5+
import java.util.Comparator;
6+
7+
import seedu.address.model.person.person.Name;
8+
import seedu.address.model.person.person.Person;
9+
10+
/**
11+
* Represents a Comparator for Person which sorts by Name.
12+
*/
13+
public class PersonComparator implements Comparator<Person> {
14+
/**
15+
* Compares Persons by Name in ascending order.
16+
*/
17+
public int compare(Person a, Person b) {
18+
requireAllNonNull(a, b);
19+
Name aName = a.getName();
20+
Name bName = b.getName();
21+
22+
return aName.compareTo(bName);
23+
}
24+
}

src/test/java/seedu/address/model/person/person/NameTest.java

Lines changed: 15 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -37,4 +37,19 @@ public void isValidName() {
3737
assertTrue(Name.isValidName("Capital Tan")); // with capital letters
3838
assertTrue(Name.isValidName("David Roger Jackson Ray Jr 2nd")); // long names
3939
}
40+
41+
@Test
42+
public void compareTo() {
43+
Name peterJack = new Name("peter jack");
44+
Name peterJackCaps = new Name("Peter Jack");
45+
Name peter = new Name("peter");
46+
47+
// small letter > big letter
48+
assertTrue(peterJack.compareTo(peterJackCaps) > 0);
49+
50+
// longer name > shorter name
51+
assertTrue(peterJack.compareTo(peter) > 0);
52+
53+
assertThrows(NullPointerException.class, () -> peterJack.compareTo(null));
54+
}
4055
}

src/test/java/seedu/address/model/person/person/UniquePersonListTest.java

Lines changed: 34 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -7,6 +7,7 @@
77
import static seedu.address.testutil.Assert.assertThrows;
88
import static seedu.address.testutil.TypicalPersons.ALICE;
99
import static seedu.address.testutil.TypicalPersons.BOB;
10+
import static seedu.address.testutil.TypicalPersons.CARL;
1011

1112
import java.util.Arrays;
1213
import java.util.Collections;
@@ -57,6 +58,16 @@ public void add_duplicatePerson_throwsDuplicatePersonException() {
5758
assertThrows(DuplicatePersonException.class, () -> uniquePersonList.add(ALICE));
5859
}
5960

61+
@Test
62+
public void add_person_sortSuccess() {
63+
uniquePersonList.add(ALICE);
64+
uniquePersonList.add(BOB);
65+
UniquePersonList expectedUniquePersonList = new UniquePersonList();
66+
expectedUniquePersonList.add(BOB);
67+
expectedUniquePersonList.add(ALICE);
68+
assertEquals(expectedUniquePersonList, uniquePersonList);
69+
}
70+
6071
@Test
6172
public void setPerson_nullTargetPerson_throwsNullPointerException() {
6273
assertThrows(NullPointerException.class, () -> uniquePersonList.setPerson(null, ALICE));
@@ -108,6 +119,17 @@ public void setPerson_editedPersonHasNonUniqueIdentity_throwsDuplicatePersonExce
108119
assertThrows(DuplicatePersonException.class, () -> uniquePersonList.setPerson(ALICE, BOB));
109120
}
110121

122+
@Test
123+
public void setPerson_sortSuccess() {
124+
uniquePersonList.add(ALICE);
125+
uniquePersonList.add(BOB);
126+
UniquePersonList expectedUniquePersonList = new UniquePersonList();
127+
expectedUniquePersonList.add(BOB);
128+
expectedUniquePersonList.add(CARL);
129+
expectedUniquePersonList.setPerson(CARL, ALICE);
130+
assertEquals(expectedUniquePersonList, uniquePersonList);
131+
}
132+
111133
@Test
112134
public void remove_nullPerson_throwsNullPointerException() {
113135
assertThrows(NullPointerException.class, () -> uniquePersonList.remove(null));
@@ -126,6 +148,18 @@ public void remove_existingPerson_removesPerson() {
126148
assertEquals(expectedUniquePersonList, uniquePersonList);
127149
}
128150

151+
@Test
152+
public void remove_person_sortSuccess() {
153+
uniquePersonList.add(ALICE);
154+
uniquePersonList.add(CARL);
155+
UniquePersonList expectedUniquePersonList = new UniquePersonList();
156+
expectedUniquePersonList.add(ALICE);
157+
expectedUniquePersonList.add(BOB);
158+
expectedUniquePersonList.add(CARL);
159+
expectedUniquePersonList.remove(BOB);
160+
assertEquals(expectedUniquePersonList, uniquePersonList);
161+
}
162+
129163
@Test
130164
public void setPersons_nullUniquePersonList_throwsNullPointerException() {
131165
assertThrows(NullPointerException.class, () -> uniquePersonList.setPersons((UniquePersonList) null));
Lines changed: 36 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,36 @@
1+
package seedu.address.model.person.util;
2+
3+
import static org.junit.jupiter.api.Assertions.assertTrue;
4+
import static seedu.address.testutil.Assert.assertThrows;
5+
import static seedu.address.testutil.TypicalPersons.ALICE;
6+
import static seedu.address.testutil.TypicalPersons.BENSON;
7+
8+
import org.junit.jupiter.api.Test;
9+
10+
import seedu.address.model.person.person.Person;
11+
import seedu.address.testutil.PersonBuilder;
12+
13+
public class PersonComparatorTest {
14+
15+
private final PersonComparator personComparator = new PersonComparator();
16+
17+
@Test
18+
public void isCorrectOrder() {
19+
assertTrue(personComparator.compare(ALICE, ALICE) == 0);
20+
21+
assertTrue(personComparator.compare(ALICE, BENSON) < 0);
22+
assertTrue(personComparator.compare(BENSON, ALICE) > 0);
23+
24+
// Alice Pauline < alice Pauline
25+
Person editedAlice = new PersonBuilder(ALICE).withName("alice Pauline").build();
26+
assertTrue(personComparator.compare(ALICE, editedAlice) < 0);
27+
28+
// Alice Pauline > Alice
29+
editedAlice = new PersonBuilder(ALICE).withName("Alice").build();
30+
assertTrue(personComparator.compare(ALICE, editedAlice) > 0);
31+
32+
// null Persons
33+
assertThrows(NullPointerException.class, () -> personComparator.compare(null, ALICE));
34+
assertThrows(NullPointerException.class, () -> personComparator.compare(ALICE, null));
35+
}
36+
}

0 commit comments

Comments
 (0)