2016-12-14 6 views
3

Я пытаюсь сортировать список в порядке убывания с использованием интерфейса компаратора. Но значения не сортируются в порядке убывания. Не уверен, что я делаю неправильно здесь.java - Сортировка в порядке убывания с использованием компаратора

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

ваших двух тройных условных операторов дают одинаковый результат (так как вы поменялись местами как > с < и -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); 
+0

Если и проверить источник я предоставил, то следующие критерии – Aishu

+0

-1: o1 o2 – Aishu

+0

Я следую за тот же подход, но в порядке убывания сортировка не работает – Aishu

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

Ваша текущая попытка еще сортировки в порядке возрастания.

5

@Eran уже указал на ошибку в вашем компараторе.

Я хотел бы добавить, что вы можете просто вернуть o1.age - o2.age. Результатом сравнения не должно быть точно -1 или 1 для < или > оно может быть просто отрицательным или положительным.

А вы могли бы также назвать Comparator.reversed. Или Comparator.comparing(Student::getAge).reversed().

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

} 
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 lhs.getAge().compareTo(rjs.getAge()); // Ascending order. 

Надеется, что это отвечает на ваш вопрос.

Смежные вопросы