Adloun

programmation Java (école d'ingénieur) · Chapitre 12 · Application directe du cours

Classement d'un championnat

Collections et génériques · niveau 2

Énoncé

Une équipe a un nom, un nombre de points et une différence de buts. Le classement range les équipes par points décroissants ; à égalité de points, par différence de buts décroissante ; à égalité encore, par nom croissant. Écrire la classe Equipe et un Comparator<Equipe>, puis classer Lyon (20 points, différence ), Brest (, ), Nice (, ) et Lens (, ).

Corrigé

Le comparateur examine les critères dans l'ordre : il ne passe au critère suivant qu'en cas d'égalité sur le précédent. Pour obtenir un ordre décroissant, il suffit d'appeler Integer.compare en échangeant ses deux arguments.


import java.util.ArrayList;
import java.util.Collections;
import java.util.Comparator;
import java.util.List;

public class Exo11Classement {
    static class Equipe {
        final String nom; final int points, difference;
        Equipe(String nom, int points, int difference) {
            this.nom = nom; this.points = points; this.difference = difference;
        }
        @Override public String toString() { return nom + " " + points + " pts (" + difference + ")"; }
    }
    static class OrdreClassement implements Comparator<Equipe> {
        @Override public int compare(Equipe a, Equipe b) {
            if (a.points != b.points) return Integer.compare(b.points, a.points);           // décroissant
            if (a.difference != b.difference) return Integer.compare(b.difference, a.difference);
            return a.nom.compareTo(b.nom);                                                   // croissant
        }
    }
    public static void main(String[] args) {
        List<Equipe> l = new ArrayList<>();
        l.add(new Equipe("Lyon", 20, 5));
        l.add(new Equipe("Brest", 23, 2));
        l.add(new Equipe("Nice", 20, 9));
        l.add(new Equipe("Lens", 20, 5));
        Collections.sort(l, new OrdreClassement());
        for (int i = 0; i < l.size(); i++) System.out.println((i + 1) + ". " + l.get(i));
    }
}

1. Brest 23 pts (2)
2. Nice 20 pts (9)
3. Lens 20 pts (5)
4. Lyon 20 pts (5)

Brest est premier malgré une moins bonne différence de buts : les points priment. Lens et Lyon sont à égalité de points et de différence : l'ordre alphabétique les départage. Le chapitre 13 écrira ce même comparateur en une seule expression, sans classe auxiliaire (exercice 13.3).

100 % gratuit

La suite du chapitre est sur Adloun

Exercice suivant et tuteur

Sans compte : le cours et le premier QCM. Exercices et tuteur : inscription gratuite en 30 secondes, sans carte bancaire.

Le cours du chapitre · Tous les exercices du chapitre

Exercice suivant et tuteur →