我有一个具有以下属性的对象:
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},
]
我找到了以下代码How do I sort a list by different parameters at different timed
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;
}
它说是(result != 0) then return result
这意味着我打电话给Collections.sort(list, decending(getComparator(NAME_SORT, ID_SORT)));
和&#34; name&#34;比较返回非零,它将不适用于&#34; ID_SORT&#34;
它会如何运作?请解释上面的代码将如何适用于我上面的示例?
还是我完全忽略了这一点?
答案 0 :(得分:1)
上面的代码看起来像是有一个排序标准的顺序。
“name”比较返回非零,它将不适用于“ID_SORT”
这是正确的行为;如果它为零,它们是相等的,所以继续下一个标准。否则使用这个。
但是,我可以建议另一种方法 - 使用库排序稳定的事实,因此如果您逐年应用排序,那么按顺序,您按顺序排序列表,如果顺序相同,然后按日期。
答案 1 :(得分:1)
它说if(result!= 0)然后返回结果,这意味着如果我调用Collections.sort(list,decending(getComparator(NAME_SORT, ID_SORT)));并且“name”比较返回非零,它将不适用 与“ID_SORT”相比
当“ NAME_SORT ”比较器在此行返回非零时: - int result = option.compare(o1,o2);
然后,在getComparator方法中创建的自定义比较器将根据 NAME_SORT 比较方法中的比较逻辑重新排序(排序)o1和o2。
现在,如果 NAME_SORT 比较器发现比较中的两个对象相同,那么在没有撤回任何内容的情况下,getcomparator中创建的自定义比较器会检查下一个比较器的比较方法,直到它完成所有传递的比较器
对于您的情况,您需要比较ID,然后以相同的方式选择日期比较器。