0
votes

Java - Comment fonctionne le comparateur si la valeur de retour est zéro?

J'essaie d'écrire une méthode Tiebreaker en Java qui retournera une entrée basée sur une valeur dans un comparateur code>. Ceci est la méthode abstraite:

  @Override
    protected Comparator<Map.Entry<Team, Stats>> getLeagueTableEntryComparator() {

        return (Map.Entry<Team, Stats> teamStatsEntryOne, Map.Entry<Team, Stats> teamStatsEntryTwo) -> {

            int compare = Integer.compare(teamStatsEntryOne.getValue().getPoints(),
                    teamStatsEntryTwo.getValue().getPoints());

            if (compare == 0) {

                compare = Integer.compare(teamStatsEntryOne.getValue().getTotalGoalDifference(),
                        teamStatsEntryTwo.getValue().getTotalGoalDifference());

                if (compare == 0) {

                    compare = Integer.compare(teamStatsEntryOne.getValue().getGoalsFor(),
                            teamStatsEntryTwo.getValue().getGoalsFor());

            }

            return compare;

        };
   }
}


0 commentaires

3 Réponses :


0
votes

comparer = 0 Les objets moyens sont égaux et il n'est pas nécessaire de les échanger (dans le tri)


0 commentaires

3
votes

Si le comparateur renvoie 0, les deux entrées sont considérées comme équivalentes. Il est alors à vous de décider de quoi faire avec ces connaissances - vous pouvez choisir au hasard entre les deux éléments équivalents ou simplement appliquer le même traitement à chacun (par exemple, dans cette usecase, si les deux équipes sont indiscernables les unes des autres, vous pourrait décider de choisir au hasard entre eux, déclarez-les comme des co-champions ou même décider qu'ils devraient jouer un jeu de disjoncteur.

Notez que vous ne devez jamais introduire une partie aléatoire dans le code du comparateur, cependant, cela entraînera le comportement du comparateur non déterministe et violer le contrat de comparateur général.


1 commentaires

Merci, que suggéreriez-vous d'être la meilleure façon de choisir entre deux entrées au hasard sans remplacer le code ci-dessus?



2
votes

Le comportement qui se produit lorsque le comparateur renvoie 0 dépend de comment vous utilisez le comparateur .

Si vous utilisez le comparateur pour trier une liste avec collections.sort ou list.sort.sort , le comparateur renvoyant 0 signifie que Trier doit laisser les éléments dans leur commande d'origine.

Si vous voulez randomiser la commande Dans ce scénario, vous pouvez utiliser collections.shuffle pour réorganiser la liste avant de le trier. Cela garantit que tous les articles "équivalents" ont la même chance de sortir en premier. xxx

si vous n'avez que deux éléments et que vous voulez les comparer, vous pouvez appeler Comparez directement et brisez les liens de quelle manière que vous voulez si le résultat est égal à zéro. Par exemple, pour un choix aléatoire, vous pouvez utiliser une instance de la classe aléatoire xxx


0 commentaires