Компаратор не работает, я не могу найти ошибку - PullRequest
0 голосов
/ 08 ноября 2018

Я пытаюсь отсортировать список объектов, извлеченных из базы данных, с помощью объекта сравнения. Он должен сравнивать фамилии и, если фамилии одинаковы, он должен сравнивать имена и определять их порядок, поэтому если у меня есть такой список:

[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]}

"Зед" должен быть вторым, но он последний. Есть идеи как исправить эту логику?

Ответы [ 2 ]

0 голосов
/ 08 ноября 2018

это то, что вы сделали:

c1.getLastName().toLowerCase().equals(c1.getLastName().toLowerCase()

вы сравниваете c1's фамилию с c1's фамилией

вместо этого сделайте это:

c1.getLastName().toLowerCase().equals(c2.getLastName().toLowerCase()

То же самое относится и к имени!

0 голосов
/ 08 ноября 2018

Использование Comparator API:

 Comparator<Contact> comparator = 
       Comparator.comparing(Contact::getLastName, String.CASE_INSENSITIVE_ORDER)
                 .thenComparing(Concat::getFirstName, String.CASE_INSENSITIVE_ORDER)
                 .thenComparingInt(Contact::getContactId);
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...