繁体   English   中英

使用比较器按降序排序

[英]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

比较器文档——返回:负整数、零或正整数,因为第一个参数小于、等于或大于第二个参数。 来源是从这里找到的

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

您的两个三元条件运算符产生相同的结果(因为您将><-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);

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

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

你也可以调用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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM