У меня есть объект со следующими свойствами:
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",
Как это работает? Пожалуйста, объясните, как код выше будет работать для моего примера выше?
Или я совершенно не понимаю смысла?
Вышеприведенный код выглядит так, как будто он имеет порядок сортировки.
"name" compare возвращает ненулевое значение, оно не будет применяться к "ID_SORT",
Это правильное поведение; если он равен нулю, они равны, поэтому переходим к следующим критериям. В противном случае используйте это.
Однако я могу предложить другой метод - использовать тот факт, что сортировки библиотеки стабильны, и поэтому, если вы применяете сортировку сначала по годам, то по порядку вы получаете список, отсортированный по заказу, и если заказ одинаков, то по дате,
Он говорит 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, проверяет следующий метод сравнения компаратора, пока он не закончит все прошедшие компараторы.
Для вашего случая вам нужно сравнить идентификаторы, а затем перейти к компаратору даты таким же образом.