首页 文章

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

提问于
浏览
6

我正在尝试使用 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 回答

  • 5

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

    我想补充一点,您可能只返回o1.age - o2.age。比较结果不一定是<>-11,也可以是负数或正数。

    而且您还可以拨打Comparator.reversed。或Comparator.comparing(Student::getAge).reversed()

  • 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

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

    假设您为学生定义了一种吸气方法"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.
    

    希望这能回答您的问题。

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

    您当前的尝试仍将按升序对其进行排序。

  • 0
    return o1.age > o2.age ? -1 :(o1.age < o2.age ? 1 : 0);
    

    但是对于下降,只需将上升的 return 语句与-1 相乘即可。像这样

    -1*(return o1.age > o2.age ? 1 :(o1.age < o2.age ? -1 : 0))
    
  • 0

    滥用三元条件为 error-prone,因为它不可读。

    为什么不简单地为下降的比较器编写经典的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;
      }
    
    }
    
  • 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降序,这是不正确的。

相关问题