Le tri des ints en java renvoie d'abord des nombres négatifs?


J'ai un comparateur comme ceci:

Collections.sort( sortedPlayers, new Comparator<RoundPlayer>()
{
    public int compare(RoundPlayer p1, RoundPlayer p2)
    {
        return p1.getScore() - p2.getScore();
    }
});

Tried players est une liste d'objets joueurs, les scores qu'ils renvoient sont des ints tels que, 200, -300, 1000 etc.

Le but du comparateur est de les trier afin qu'ils soient par ordre décroissant, 1000, 200, -300.

Cependant, ce comparateur semble renvoyer des résultats erratiques. Souvent avec des nombres négatifs qui sortent en premier.

Author: MrLore, 2014-06-26

2 answers

Inversez simplement votre valeur de retour que vous avez actuellement

Exemple de

return p2.getScore() - p1.getScore(); //will sort in descending order
 4
Author: Rod_Algonquin, 2014-06-25 21:22:39

Si vous souhaitez trier par ordre décroissant, envisagez d'envelopper vos collections Comparatoren utilisant .Ordre inverse (cmp de comparaison) .

Notez également que soustraire les deux valeurs est une mauvaise idée à cause du débordement d'entiers. Votre logique compare est p1.getScore() - p2.getScore(). Considérer p1.score = 2147483647, p2.score = -2147483648, votre comparateur renverrait -1, indiquant incorrectement que le score de p1 est inférieur au score de p2.

La logique correcte consiste à tester pour, en renvoyant -1, 0 et 1. Mieux encore, Integer implémente déjà cette logique afin que vous puissiez simplement déléguer à sa méthode compareTo.

return Integer.valueOf(p1.getScore()).compareTo(Integer.valueOf(p2.getScore());
 2
Author: Steve Kuo, 2014-06-26 00:28:16