[英]Sorting a List in descending order using reverseOrder() with custom Comparator?
[英]Sorting in Descending order using 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
比较器文档——返回:负整数、零或正整数,因为第一个参数小于、等于或大于第二个参数。 来源是从这里找到的
谁能告诉我为什么降序排序不起作用?
您的两个三元条件运算符产生相同的结果(因为您将>
与<
和-1
与1
交换):
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
对于降序,您需要:
return o1.age > o2.age ? -1 :(o1.age < o2.age ? 1 : 0);
@Eran 已经指出了比较器中的错误。
我想补充一点,您可以只返回o1.age - o2.age
。 对于<
或>
,比较的结果不必正好是-1
或1
,它可能只是负数或正数。
你也可以调用Comparator.reversed
。 或Comparator.comparing(Student::getAge).reversed()
。
滥用三元条件容易出错,因为不可读。
为什么不简单地为降序比较器编写经典的if-else-if
呢?
public class AgeComparatorDesc implements Comparator<Student> {
@Override
public int compare(Student o1, Student o2) {
if (o1.age > o2.age) {
return -1;
} else if (o1.age < o2.age) {
return 1;
}
return 0;
}
}
您可以直接使用比较器类实例。 下面是代码示例。
假设您为学生定义了一个 getter 方法"getAge()"
。
Comparator<Student> m_studentComparator = new Comparator<Sudent>() {
@Override
public int compare(Student lhs, Student rhs) {
return rhs.getAge().compareTo(lhs.getAge()); // Descending order
}
};
Collections.sort(<<Your list>> , m_studentComparator); // this would return the descending order list.
如果你想要一个升序列表,只需将覆盖方法中的 return 语句更改为
return lhs.getAge().compareTo(rjs.getAge()); // Ascending order.
希望这能回答你的问题。
年龄值是一个整数,看起来总是正数,可以使用这个缩短代码。
return o1.age - o2.age; // Ascending
return o2.age - o1.age; // Descending
此代码不能用于负值。
例如,
如果o1.age = 10
, o2.age = 11
,此代码将返回-1
升序和1
降序,这是正确的。
但是在o1.age = -10
, o2.age = -11
的情况下,此代码将返回1
升序和-1
降序,这是不正确的。
那么你应该把它写成:
return o1.age < o2.age ? 1 :(o1.age > o2.age ? -1 : 0);
或写成:
return o1.age > o2.age ? -1 :(o1.age < o2.age ? 1 : 0);
您当前的尝试仍将按升序对其进行排序。
return o1.age > o2.age ? -1 :(o1.age < o2.age ? 1 : 0);
尽管对于降序,只需将升序返回语句乘以 -1。 像这样
-1*(return o1.age > o2.age ? 1 :(o1.age < o2.age ? -1 : 0))
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.