我正在尝试使用 Comparator 接口按降序对列表进行排序。但是,这些值未按降序排序。不知道我在做什么错。
public class Student {
int rollNo;
String name;
int age;
public Student(int RollNo, String Name, int Age){
this.rollNo = RollNo;
this.name = Name;
this.age = Age;
}
}
public class AgeComparator implements Comparator<Student>{
@Override
public int compare(Student o1, Student o2) {
return o1.age > o2.age ? 1 :(o1.age < o2.age ? -1 : 0); //Ascending
//return o1.age < o2.age ? -1 :(o1.age > o2.age ? 1 : 0); // Descending
}
}
public class Comparator_Sort {
public static void main(String[] args) {
// TODO Auto-generated method stub
ArrayList<Student> al = new ArrayList<Student>();
al.add(new Student(5978,"Vishnu", 50));
al.add(new Student(5979,"Vasanth", 30));
al.add(new Student(5980,"Santhosh", 40));
al.add(new Student(5981,"Santhosh", 20));
al.add(new Student(5982,"Santhosh", 10));
al.add(new Student(5983,"Santhosh", 5));
Collections.sort(al, new AgeComparator());
for(Student s : al){
System.out.println(s.rollNo+" "+s.name+" "+s.age);
}
}
}
我可以按升序对列表进行排序,但是我无法按降序对列表进行排序
return o1.age > o2.age ? 1 :(o1.age < o2.age ? -1 : 0); //Sorted in Ascending
return o1.age < o2.age ? -1 :(o1.age > o2.age ? 1 : 0); // Not sorted in Descending
比较器文档-返回:负整数,零或正整数,因为第一个参数小于,等于或大于第二个参数。来源来自这里
谁能告诉我为什么降序排序不起作用?
7 回答
@Eran 已经指出了比较器中的错误。
我想补充一点,您可能只返回
o1.age - o2.age
。比较结果不一定是<
或>
的-1
或1
,也可以是负数或正数。而且您还可以拨打Comparator.reversed。或
Comparator.comparing(Student::getAge).reversed()
。您的两个三元条件运算符会产生相同的结果(因为您同时将
>
和<
以及-1
和1
交换了):对于降序,您需要:
您可以直接使用比较器类实例。下面是代码示例。
假设您为学生定义了一种吸气方法
"getAge()"
。如果要升序列表,只需将覆盖方法中的 return 语句更改为
希望这能回答您的问题。
好吧,您应该将其编写为:
或写为:
您当前的尝试仍将按升序对其进行排序。
但是对于下降,只需将上升的 return 语句与-1 相乘即可。像这样
滥用三元条件为 error-prone,因为它不可读。
为什么不简单地为下降的比较器编写经典的
if-else-if
呢?age 值是一个整数,似乎总是正数,可以使用此缩短代码。
此代码不能用于负值。
例如,
如果
o1.age = 10
,o2.age = 11
,则此代码将返回-1
升序和1
降序,这是正确的。但是情况
o1.age = -10
,o2.age = -11
,此代码将返回1
升序和-1
降序,这是不正确的。