Подтвердить что ты не робот

Как обрабатывать нули при использовании коллекции Java-коллекции

При использовании Collection.sort в Java, что я должен вернуть, когда один из внутренних объектов имеет значение null

Пример:

Collections.sort(list, new Comparator<MyBean>() {
    public int compare(MyBean o1, MyBean o2) {
      return o2.getDate().compareTo(o1.getDate());
     } 

});

Предположим, что o2 не является нулевым, но o2.getDate(), так что я должен возвращать 1 или -1 или 0 при добавлении нулевой проверки?

4b9b3361

Ответ 1

Естественно, это ваш выбор. Какую бы логику вы ни пишете, она будет определять правила сортировки. Поэтому "should" на самом деле не является правильным словом.

Если вы хотите, чтобы нуль отображался перед любым другим элементом, что-то вроде этого могло бы сделать

public int compare(MyBean o1, MyBean o2) {
    if (o1.getDate() == null) {
        return (o2.getDate() == null) ? 0 : -1;
    }
    if (o2.getDate() == null) {
        return 1;
    }
    return o2.getDate().compareTo(o1.getDate());
} 

Ответ 2

В Java 8 вы также можете использовать nullsFirst():

Comparator.nullsFirst(Date::compareTo).compare(dateOne, dateTwo);

Или nullsLast():

Comparator.nullsLast(Date::compareTo).compare(dateOne, dateTwo);

Эти методы будут либо сортировать null до начала, либо до конца. Неправильно или правильно, считаете ли вы, что null больше или меньше других объектов. Это полностью зависит от вас, как уже заявили другие.

Ответ 3

Это зависит, считаете ли вы, что значение null является большим или низким значением.

Вы можете считать большую часть времени, когда null < все остальное, но это зависит от контекста.

И 0 будет ужасным возвратным значением здесь.

Ответ 4

Следуя ответу от Никиты Рыбака, у меня уже есть компаратор перечислений, и только добавьте здесь нулевую логику.

public enum Orden implements Comparator<CmunParametrosDTO> {
        ByStrDescripcion {
            public int compare(CmunParametrosDTO item1, CmunParametrosDTO item2) {
                if (item1.getStrDescripcion() == null && item2.getStrDescripcion() == null)
                    return 0;
                if (item1.getStrDescripcion() == null)
                    return 1;
                else if (item2.getStrDescripcion() == null)
                    return -1;
                return item1.getStrDescripcion().compareTo(item2.getStrDescripcion());
            }
        }
        public abstract int compare(CmunParametrosDTO item1, CmunParametrosDTO item2);

        public Comparator<CmunParametrosDTO> ascending() {
            return this;
        }

        public Comparator<CmunParametrosDTO> descending() {
            return Collections.reverseOrder(this);
        }
}

В этой форме я могу вызвать метод сортировки в моем списке.

    if(isBolOrdAscendente()) Collections.sort(listado, CmunParametrosDTO.Orden.ByStrDescripcion .ascending());
    else Collections.sort(listado, CmunParametrosDTO.Orden.ByStrDescripcion .descending());