Сортировка по нескольким атрибутам в объекте

1

У меня есть объект со следующими свойствами:

MyObject {

int order;
Date date;

}

У меня есть список объектов:

[
  {1, 2010},
  {9, 2011},
  {9, 2020},
  {2, 2001},
  {1, 2001}
]

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

[
  {1, 2010},
  {1, 2001}
  {2, 2001}
  {9, 2011},
  {9, 2020},
]

Я нашел следующий код. Как отсортировать список по разным параметрам в разные сроки

enum PersonComparator implements Comparator<Person> {
    ID_SORT {
        public int compare(Person o1, Person o2) {
            return Integer.valueOf(o1.getId()).compareTo(o2.getId());
        }},
    NAME_SORT {
        public int compare(Person o1, Person o2) {
            return o1.getFullName().compareTo(o2.getFullName());
        }};

    public static Comparator<Person> decending(final Comparator<Person> other) {
        return new Comparator<Person>() {
            public int compare(Person o1, Person o2) {
                return -1 * other.compare(o1, o2);
            }
        };
    }

    public static Comparator<Person> getComparator(final PersonComparator... multipleOptions) {
        return new Comparator<Person>() {
            public int compare(Person o1, Person o2) {
                for (PersonComparator option : multipleOptions) {
                    int result = option.compare(o1, o2);
                    if (result != 0) {
                        return result;
                    }
                }
                return 0;
            }
        };
    }
}

Моя путаница/вопрос:

            public int compare(Person o1, Person o2) {
                for (PersonComparator option : multipleOptions) {
                    int result = option.compare(o1, o2);
                    if (result != 0) {
                        return result;
                    }
                }
                return 0;
            }

Он говорит if (result != 0) then return result

что означает, если я вызываю like Collections.sort(list, decending(getComparator(NAME_SORT, ID_SORT)));

и "имя" сравнивает значение, отличное от нуля, оно не будет применяться к "ID_SORT",

Как это работает? Пожалуйста, объясните, как код выше будет работать для моего примера выше?

Или я совершенно не понимаю смысла?

  • 1
    Да, вот как это будет работать. Кстати, если объект ниже, чем другие по названию, зачем их сравнивать с идентификатором?
Теги:
sorting

2 ответа

1
Лучший ответ

Вышеприведенный код выглядит так, как будто он имеет порядок сортировки.

"name" compare возвращает ненулевое значение, оно не будет применяться к "ID_SORT",

Это правильное поведение; если он равен нулю, они равны, поэтому переходим к следующим критериям. В противном случае используйте это.

Однако я могу предложить другой метод - использовать тот факт, что сортировки библиотеки стабильны, и поэтому, если вы применяете сортировку сначала по годам, то по порядку вы получаете список, отсортированный по заказу, и если заказ одинаков, то по дате,

  • 0
    Извините за ошибку ... теперь понимаю
1

Он говорит if (result! = 0), а затем возвращает результат, который означает, что я вызываю как Collections.sort(list, decending (getComparator (NAME_SORT, ID_SORT))); и "имя" сравнивает значение, отличное от нуля, оно не будет применяться к "ID_SORT",

Когда компаратор " NAME_SORT " возвращает ненулевое значение в этой строке: - int result = option.compare(o1, o2);

Тогда пользовательский компаратор, созданный в вашем методе getComparator, будет переупорядочивать (сортировать) o1 и o2 в соответствии с логикой сравнения в методе сравнения NAME_SORT.

Теперь, если сопоставитель NAME_SORT обнаруживает, что два сравниваемых объекта одинаковы, а затем не сохраняя ничего, пользовательский компаратор, созданный в getcomparator, проверяет следующий метод сравнения компаратора, пока он не закончит все прошедшие компараторы.

Для вашего случая вам нужно сравнить идентификаторы, а затем перейти к компаратору даты таким же образом.

Ещё вопросы

Сообщество Overcoder
Наверх
Меню