Лучший способ реализовать метод сравнения Comparator в Java? - PullRequest
2 голосов
/ 06 января 2012

Я написал компаратор, который сортирует по возрастанию, как показано ниже.который работает хорошо.

Collections.sort(resultList,new Comparator<MyModelClass>() {
            @Override
            public int compare(MyModelClass o1, MyModelClass o2) {
                Integer id1= o1.getId();
                Integer id2= o2.getId();
                if(id1 == null && id2 == null) {
                    return 0;               
                }else if(id1 != null && id2 == null) {
                    return -1;
                } else if (id1 == null && id2 != null) {
                    return 1;
                } else {                
                    return id1.compareTo(id2);
                }
            }
        });

это хорошо для реализации, как это?Пожалуйста, помогите мне?

Спасибо!

Ответы [ 5 ]

5 голосов
/ 06 января 2012

Это выглядит хорошо для читабельности, но немного более эффективный способ может быть:

public int compare(MyModelClass o1, MyModelClass o2) {
    Integer id1= o1.getId();
    Integer id2= o2.getId();
    if (id1 == null) {
        return id2 == null ? 0 : 1;
    }
    if (id2 == null) {
        return -1;
    }
    return id1.compareTo(id2);
}

или даже:

public int compare(MyModelClass o1, MyModelClass o2) {
    Integer id1= o1.getId();
    Integer id2= o2.getId();
    if (id1 == null) {
        return id2 == null ? 0 : 1;
    }

    return id2 == null ? -1 : id1.compareTo(id2);
}
3 голосов
/ 06 января 2012

Если вам нужна нулевая логика сравнения в нескольких компараторах, я бы предложил использовать статический помощник в служебном классе, например:

public static int compare(Comparable c1, Comparable c2) {
    return c1 == null
               ? (c2 == null ? 0 : 1)
               : (c2 == null ? -1 : c1.compareTo(c2));
}

Компаратор может быть упрощен до:

public int compare(MyModelClass o1, MyModelClass o2) {
    return CompareHelper.compare(o1.getId(), o2.getId());
}
1 голос
/ 06 января 2012

Нет, это не очень хорошая реализация.

В спецификации java.util.List говорится, что в списке могут быть пустые значения, а в некоторых случаях вы можете иметь несколько пустых значений. Ваш компаратор завершится с ошибкой NullPointerException, как только он попытается выполнить o?.getId() для нулевого элемента.

Что я обычно делаю, так это делаю мой класс implement java.lang.Comparable, затем я могу использовать карту для сортировки элементов по мере их добавления. Обычно нужно составить список, так почему бы не построить TreeMap вместо этого?

Если вы повторно используете свой класс и хотите отсортировать его по-разному, вы можете создать TreeMap с Comparator в конструкторе, чтобы не было необходимости явно сортировать его.

1 голос
/ 06 января 2012

Да, я делаю то же самое.Одно замечание может заключаться в том, что вы можете использовать такие нулевые безопасные инструменты сравнения, как NullComparator Apache Commons Collections, чтобы отбросить все эти нулевые проверки в вашем коде:

http://commons.apache.org/collections/api-2.1.1/org/apache/commons/collections/comparators/NullComparator.html#compare(java.lang.Object, java.lang.Object)

1 голос
/ 06 января 2012

Если getId() возвращает int, вы можете просто пойти с return id1.compareTo(id2), это даст вам правильный результат.Надеюсь, это поможет.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...