java - 使用比较器以降序排序

时间:2016-12-14 11:39:21

标签: java sorting

我尝试使用比较器接口按降序对列表进行排序。但是值不按降序排序。不知道我在这里做错了什么。

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

比较器文档 - 返回:负整数,零或正整数,因为第一个参数小于,等于或大于第二个参数。来源可以从here

找到

有谁能告诉我为什么降序排序不起作用?

7 个答案:

答案 0 :(得分:9)

您的两个三元条件运算符产生相同的结果(因为您将><交换,-11交换:

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);

答案 1 :(得分:5)

@Eran已经指出比较器中的错误。

我想补充一点,你可以回复o1.age - o2.age。对于-11,比较结果不一定是<>,它可能只是消极或正面。

你也可以打电话给Comparator.reversed。或Comparator.comparing(Student::getAge).reversed()

答案 2 :(得分:1)

您可以直接使用比较器类实例。下面是代码示例。

假设您为学生定义了一个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.

希望这能回答你的问题。

答案 3 :(得分: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); 

您当前的尝试仍将按升序排序。

答案 4 :(得分: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))

答案 5 :(得分:0)

滥用三元条件容易出错,因为不可读。

为什么不简单地为降序比较器写经典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;
  }

}

答案 6 :(得分:0)

age值是一个整数,似乎总是正数,您可以使用此缩短代码。

return o1.age - o2.age; // Ascending
return o2.age - o1.age; // Descending

此代码不能用于负值。

例如

如果o1.age = 10o2.age = 11,则此代码将返回-1进行升序,返回1进行降级,这是正确的。

但是在o1.age = -10o2.age = -11的情况下,此代码将返回1进行升序,返回-1进行降级,这是不正确的。