我正在寻找一种基于其多个字段之一对对象列表进行排序的方法(我最后只是自己提问)但在我的研究中,我遇到了这个答案:
https://stackoverflow.com/a/1421537/1549672
我对java很新,这可能是原因,但我不太明白最后一种方法:
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;
}
};
}
有人可以解释它是如何工作的......它到底是做什么的? 谢谢!
答案 0 :(得分:4)
它将找到第一个不会返回“等于”并返回其值的比较器,否则它将返回“等于”。
实际上,它会创建一个新的Comparator来实现这一点,方法是创建一个基于Comparator接口的匿名类。
public static Comparator<Person> getComparator(
final PersonComparator... multipleOptions)
{
return new Comparator<Person>() { //create anonymous class
public int compare(Person o1, Person o2) { //which implements the only method
//in Comparator
for (PersonComparator option : multipleOptions) { //loop through given
//comparators
int result = option.compare(o1, o2);
if (result != 0) { //return value of the first
return result; //which says "non-equal"
}
}
return 0;//all said "equals" so we say "equals"
}
};
}
答案 1 :(得分:1)
您正在使用Comparator比较两个人对象。
比较其订单的两个参数。返回一个负整数, 零或正整数,因为第一个参数小于,等于 到,或大于第二个
答案 2 :(得分:1)
getComparator
方法将返回比较器,该比较器将根据其参数中传递的比较器比较两个Person
个对象。 PersonComparator
中的每一个都旨在将Person与Person类字段之一进行比较,例如
PersonComparator.ID_SORT
将按id
(0 <1 <2 <3 <...)PersonComparator.NAME_SORT
将使用自然(字典)顺序(“a”&lt;“aa”&lt;“ab”&lt;“b”)按名称比较Person对象。 如果您的Person类有更多字段,那么您可以将新比较器添加到枚举PersonComparator
。
传递给getComparator
方法的PersonComparators的顺序也很重要。
例如,如果你有人
Person p1 = new Person(1,"Jack");
Person p2 = new Person(2,"Jack");
Person p3 = new Person(2,"Adam");
您将通过
创建比较器getComparator(PersonComparator.ID_SORT,PersonComparator.NAME_SORT)
它将首先通过id
s对人进行排序,如果ids洁具相等,则会按名称对其进行排序
(1,"Jack") (2,"Adam") (2,"Jack")
也是由
创建的比较器getComparator(PersonComparator.NAME_SORT, PersonComparator.ID_SORT)
将第一次比较名称,并且只有在名称相等的情况下它才会比较人员的ID,因此您将获得按此方式排序的人员
(2,"Adam") (1,"Jack") (2,"Jack")
答案 3 :(得分:0)
基本上,此方法接收可变数量的PersonComparator对象,然后迭代它们以比较返回第一个比较器的两个人对象,该比较器不返回两个给定人物对象之间的匹配。
答案 4 :(得分:0)
您将其他比较符final PersonComparator... multipleOptions
的列表传递给方法getComparator
。
您的比较器在for循环中使用此PersonComparators,如果由于当前PersonComparator而导致人员不相等,则返回结果。
所以,基本上,这个方法返回Comparator,如果Persons因所有传递的比较器相等而返回0,或者从传递的比较器compareTo
方法返回第一个非匹配的int。