Collecties sort(List<T>,Comparator<? super T>) voorbeeld methode

Mogelijk duplicaat:
Java-objecten sorteren met meerdere sleutels

Ik kan geen enkel voorbeeld vinden van het gebruik van deze methode, alle voorbeelden geven de tweede parameter “null”.
Ik heb gehoord dat deze methode wordt gebruikt voor het sorteren van klassen op meer dan één criterium, maar er is geen voorbeeld gevonden.

public class Student implements Comparable<Student> {
String name;
int age;
public Student(String name, int age) {
    this.name = name;
    this.age = age;
}
@Override
public String toString() {
    return name + ":" + age;
}
@Override
public int compareTo(Student o) {
    Integer myAge = age;
    Integer oAge = o.age;
    return myAge.compareTo(oAge);
}

}

voor deze klas als ik een lijst met studenten wil sorteren op hun naam & leeftijden hoe kan ik de methode gebruiken Collections sort(List,Comparator)


Antwoord 1, autoriteit 100%

Voortbouwend op uw bestaande Student-klas, is dit hoe ik het meestal doe, vooral als ik meer dan één vergelijker nodig heb.

public class Student implements Comparable<Student> {
    String name;
    int age;
    public Student(String name, int age) {
       this.name = name;
       this.age = age;
    }
    @Override
    public String toString() {
        return name + ":" + age;
    }
    @Override
    public int compareTo(Student o) {
        return Comparators.NAME.compare(this, o);
    }
    public static class Comparators {
        public static Comparator<Student> NAME = new Comparator<Student>() {
            @Override
            public int compare(Student o1, Student o2) {
                return o1.name.compareTo(o2.name);
            }
        };
        public static Comparator<Student> AGE = new Comparator<Student>() {
            @Override
            public int compare(Student o1, Student o2) {
                return o1.age - o2.age;
            }
        };
        public static Comparator<Student> NAMEANDAGE = new Comparator<Student>() {
            @Override
            public int compare(Student o1, Student o2) {
                int i = o1.name.compareTo(o2.name);
                if (i == 0) {
                    i = o1.age - o2.age;
                }
                return i;
            }
        };
    }
}

Gebruik:

List<Student> studentList = new LinkedList<>();
Collections.sort(studentList, Student.Comparators.AGE);

BEWERKEN

Sinds de release van Java 8 kan de innerlijke klasse Comparatorsaanzienlijk worden vereenvoudigd met behulp van lambdas. Java 8 introduceert ook een nieuwe methode voor het Comparator-object thenComparing, waardoor het niet meer nodig is om elke comparator handmatig te controleren bij het nesten. Hieronder vindt u de Java 8-implementatie van de klasse Student.Comparators, waarbij rekening is gehouden met deze wijzigingen.

public static class Comparators {
    public static final Comparator<Student> NAME = (Student o1, Student o2) -> o1.name.compareTo(o2.name);
    public static final Comparator<Student> AGE = (Student o1, Student o2) -> Integer.compare(o1.age, o2.age);
    public static final Comparator<Student> NAMEANDAGE = (Student o1, Student o2) -> NAME.thenComparing(AGE).compare(o1, o2);
}

Antwoord 2, Autoriteit 55%

Dit kan de eenvoudigste manier zijn –

Collections.sort(listOfStudent,new Comparator<Student>(){
                     public int compare(Student s1,Student s2){
                           // Write your logic here.
                     }});

Java 8 (Lambda-expressie) gebruiken –

listOfStudent.sort((s1, s2) -> s1.age - s2.age); 

Antwoord 3, Autoriteit 11%

U wilt waarschijnlijk zoiets:

Collections.sort(students, new Comparator<Student>() {
                     public int compare(Student s1, Student s2) {
                           if(s1.getName() != null && s2.getName() != null && s1.getName().comareTo(s1.getName()) != 0) {
                               return s1.getName().compareTo(s2.getName());
                           } else {
                             return s1.getAge().compareTo(s2.getAge());
                          }
                      }
);

Dit sorteert de studenten eerst op naam. Als een naam ontbreekt, of twee studenten hebben dezelfde naam, worden ze gesorteerd op hun leeftijd.


Antwoord 4, Autoriteit 3%

Om Collections sort(List,Comparator) te gebruiken, moet u een klasse maken die de Comparator Interface implementeert, en code voor de Compare() daarin, via Vergelijkingsinterface

Je kunt zoiets als dit doen:

class StudentComparator implements Comparator
{
    public int compare (Student s1 Student s2)
    {
        // code to compare 2 students
    }
}

Doe dit om te sorteren:

Collections.sort(List,new StudentComparator())

Other episodes