Я пытаюсь отсортировать список объектов, извлеченных из базы данных, с помощью объекта сравнения. Он должен сравнивать фамилии и, если фамилии одинаковы, он должен сравнивать имена и определять их порядок, поэтому если у меня есть такой список:
[Jon Doe][Zed Adams][John Adams]
Это должно быть отсортировано так:
[John Adams][Zed Adams][Jon Doe]
Теперь давайте посмотрим на мой код:
Класс компаратора:
public class ComparatorContactByName implements Comparator<Contact> {
@Override
public int compare(Contact c1, Contact c2) {
// if lastNames of compared objects are not the same, compare them
if(!c1.getLastName().toLowerCase().equals(c1.getLastName().toLowerCase())){
return c1.getLastName().compareTo(c2.getLastName());
// if lastNames are the same, compare by firstName
}else if(c1.getLastName().toLowerCase().equals(c1.getLastName().toLowerCase())){
return c1.getFirstName().toLowerCase().compareTo(c2.getFirstName().toLowerCase());
// other case like firstName and lastName are the same, compare by id
}else{
return c1.getContactId() - c2.getContactId();
}
}
}
Метод контроллера:
public void getAllContactsSortedByName(){
List<Contact> allContacts = ContactRepository.listAllContacts();
Comparator comparatorContactByName = new ComparatorContactByName();
Collections.sort(allContacts, comparatorContactByName);
if (allContacts == null) {
System.out.println("No contact found. ");
} else {
for (Contact contact : allContacts) {
System.out.println(contact.toString());
}
}
}
После вызова этого метода я получаю вывод, подобный этому:
Contact{contactId= 133, firstName= John, lastName= Adams, email= ja@email.com, groups= [gym]}
Contact{contactId= 126, firstName= Jon, lastName= Doe, email= jd@email.com, groups= [work, gym]}
Contact{contactId= 130, firstName= Zed, lastName= Adams, email= za@email.com, groups= [work]}
"Зед" должен быть вторым, но он последний. Есть идеи как исправить эту логику?