簡體   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