web-dev-qa-db-fra.com

Comment trier ArrayList à l'aide de Comparator?

J'ai un élève qui met en œuvre une méthode statique

public static Comparator<Student> getCompByName()

qui renvoie un nouvel objet comparateur pour Student qui compare 2 objets Students par l'attribut 'nom'.

Je dois maintenant tester cela en triant un tableau des étudiants par 'nom' en utilisant ma fonction getCompByName ().

Voici ma méthode Comparateur dans ma classe Etudiant.

public static Comparator<Student> getCompByName()
{   
 Comparator comp = new Comparator<Student>(){
     @Override
     public int compare(Student s1, Student s2)
     {
         return s1.name.compareTo(s2.name);
     }        
 };
 return comp;
}  

Et Main où je dois tester

public static void main(String[] args)
{
    // TODO code application logic here

    //--------Student Class Test-------------------------------------------
    ArrayList<Student> students = new ArrayList();
    Student s1 = new Student("Mike");
    Student s2 = new Student("Hector");
    Student s3 = new Student("Reggie");
    Student s4 = new Student("zark");
    students.add(s1);
    students.add(s2);
    students.add(s3);
    students.add(S4);

    //Use getCompByName() from Student class to sort students

Quelqu'un peut-il me montrer comment j'utiliserais getCompByName () dans mon fichier principal pour trier réellement la liste de tableaux par nom? Je suis nouveau pour les comparateurs et j'ai du mal avec leurs utilisations. La méthode renvoie un comparateur, donc je ne sais pas comment cela sera mis en œuvre. Je sais que je dois utiliser getCompByName () pour trier, je ne sais pas comment l'implémenter.

11
Reeggiie

Utilisez la méthode Collections.sort (List, Comparator) :

Collections.sort(students, Student.getCompByName());

Également dans votre code, il serait bon d'utiliser l'interface List lors de la déclaration de List:

List<Student> students = new ArrayList();

Vous pouvez également resserrer le code en utilisant un Student[] et en le passant au constructeur ArrayList:

public static void main(String[] args) {
    Student[] studentArr = new Student[]{new Student("Mike"),new Student("Hector"), new Student("Reggie"),new Student("zark")};
    List<Student> students = new ArrayList<Student>(Arrays.asList(studentArr));
    Collections.sort(students, Student.getCompByName());

    for(Student student:students){
        System.out.println(student.getName());
    }
}

Voici un Gist de la source complète .

16
Kevin Bowersox

Utilisez Collections.sort() :

Collections.sort(students, getCompByName());

Remarque: peut être utile pour faire de votre comparateur un private static final variable.

Note 2: modifie la liste en place ; ne crée pas de nouvelle liste.

5
fge