Tri de données avec comparateurs multiples


Description

Petit code utilitaire qui permet de manipuler une succession de comparateurs au sein du même ensemble.

Par exemple, pour un concours de duathlon (course à pied + cyclisme), on souhaite classer les candidats afin d'avoir - dans l'ordre - les 2 meilleurs au score total, puis les 2 meilleurs en courses et enfin les 2 meilleurs en cyclisme.

List<DuathlonCandidate> candidates = ...

ConstrainedSet<DuathlonCandidate> constrainedSet = new ConstrainedSet<>(Arrays.asList(
    new Constraint<>(Comparator.comparingInt(DuathlonCandidate::getTotal),   2),
    new Constraint<>(Comparator.comparingInt(DuathlonCandidate::getRunning), 2),
    new Constraint<>(Comparator.comparingInt(DuathlonCandidate::getCycling), 2)
));

constrainedSet.addAll(candidates);

System.out.println(constrainedSet.getSortedList());

Remarque : comme tout ensemble de données, on n'aura pas de doublons, donc si un candidat est meilleur au score total il ne pourra pas apparaître à nouveau avec son score individuel, on prendra alors les meilleurs suivants dans la liste.

Pour aller un peu plus loin, j'ai également mis en place un second type d'ensembles, qui permet de récupérer aléatoirement une partie des résultats dans chaque catégorie.

Même exemple de duathlon, on souhaite obtenir 2 candidats parmi les 5 premiers.

List<DuathlonCandidate> candidates = ...

PartialConstrainedSet<DuathlonCandidate> partialConstrainedSet =
    new PartialConstrainedSet<>(Arrays.asList(
        new PartialConstraint<>(Comparator.comparingInt(DuathlonCandidate::getTotal), 2, 5)
    )
);

partialConstrainedSet.addAll(candidates);

System.out.println(partialConstrainedSet.getSortedList());

Remarque : bien que choisies aléatoirement, les 2 valeurs obtenues conserveront leur ordre, on trouvera donc en premier un candidat meilleur que le second (même si ce ne sont pas forcément les deux premiers parmi les cinq meilleurs).

Codes Sources

A voir également

Vous n'êtes pas encore membre ?

inscrivez-vous, c'est gratuit et ça prend moins d'une minute !

Les membres obtiennent plus de réponses que les utilisateurs anonymes.

Le fait d'être membre vous permet d'avoir un suivi détaillé de vos demandes et codes sources.

Le fait d'être membre vous permet d'avoir des options supplémentaires.