2009-11-07 7 views
210

Existe-t-il un moyen FACILE de trier un tableau dans l'ordre décroissant, comme dans un ordre croissant dans le tri Arrays class?Java Array Tri descendant?

Ou dois-je cesser d'être paresseux et faire moi-même: [

Répondre

247

Vous pouvez utiliser cette

sort(T[] a, Comparator<? super T> c) 

Arrays.sort(a, Collections.reverseOrder()); 
+76

Il ne peut pas trier les tableaux de primitives –

+11

Convertissez vos primitives à leurs objets respectifs. Entier pour int, Double pour double, Boolean pour booléen, etc. – Ishmael

+10

si vous voulez toujours utiliser votre [comparateur] personnalisé (http://docs.oracle.com/javase/7/docs/api/java/util/Comparator .html): 'Collections.reverseOrder (this)' –

84

Vous pouvez utiliser ceci:

Arrays.sort(data, Collections.reverseOrder()); 

Collections.reverseOrder() retourne un Comparator en utilisant l'ordre naturel inverse. Vous pouvez obtenir une version inversée de votre propre comparateur en utilisant Collections.reverseOrder(myComparator).

+6

L'OP veut trier un tableau. 'Collections.sort()' prend un 'List' comme paramètre d'entrée, pas un tableau. –

+1

ops, j'ai écrit Collections au lieu de tableaux. Son corrigé maintenant. – William

+2

+1 pour expliquer comment utiliser votre propre comparateur. – dj18

74

pour une liste

Collections.sort(list ,Collections.reverseOrder()); 

pour un tableau

Arrays.sort(array, Collections.reverseOrder()); 
+12

int [] tableau = {2,4,3,6,8,7}; Arrays.sort (array, Collections.reverseOrder()); est en train de me donner une erreur! L'erreur est: "La méthode sort (int []) dans le type Arrays n'est pas applicable aux arguments (int [], Comparateur )" –

+3

int n'est pas un objet. Essayez d'utiliser Integer [] à la place. – Ornithopter

+0

Pourquoi Integer [] fonctionne-t-il et pas int []? – OpMt

3

Pour tableau qui contient des éléments de primitives s'il est org.apache.commons.lang(3) à disposition moyen facile d'inverser array (après leur tri) est d'utiliser :

ArrayUtils.reverse(array); 
+1

Pourquoi le trier d'abord dans l'ordre croissant, puis utiliser la bibliothèque externe pour inverser cet ordre, quand cela peut être fait en une seule étape? – Betlista

+0

Et ce pas étant? –

+0

voir les réponses ci-dessus - 'Arrays.sort()' avec le comparateur 'reverseOrder' ... – Betlista

2

Je ne sais pas ce que cependant était votre cas d'utilisation, en plus o Les réponses à cette question sont les suivantes: une autre option (paresseuse) consiste à trier toujours dans l'ordre croissant comme indiqué, puis à itérer dans inverser l'ordre à la place.

31

une alternative pourrait être (pour les numéros !!!)

  1. multiplier Array par -1
  2. sorte
  3. se multiplient encore une fois avec -1

Littéralement parlé:

array = -Arrays.sort(-array) 
+16

' {__________ lol ________} ' –

+7

Cette méthode est réellement créative si nous classons des nombres, même si elle n'est pas générique et pourrait causer des problèmes de débordement ... – hackjutsu

+2

Ceci est une très bonne réponse pour les types primitifs . Tu es un génie. –

42

sans COMPARATO explicite r:

Collections.sort(list, Collections.reverseOrder()); 

avec comparateur explicite:

Collections.sort(list, Collections.reverseOrder(new Comparator())); 
4

Java 8:

Arrays.sort(list, comparator.reversed()); 

Update: reversed() inverse le comparateur spécifié. Habituellement, les comparateurs passent en ordre croissant, donc cela change l'ordre de décroissant.

2

Vous devez d'abord trier votre tableau en utilisant:

 Collections.sort(Myarray); 

Ensuite, vous devez inverser l'ordre d'ascendant à descendant en utilisant:

 Collections.reverse(Myarray); 
2

Une autre solution est que si vous êtes en utilisant l'interface comparable, vous pouvez changer les valeurs de sortie que vous avez spécifié dans votre compareTo (Object bCompared).

Par exemple:

public int compareTo(freq arg0) 
{ 
    int ret=0; 
    if(this.magnitude>arg0.magnitude) 
     ret= 1; 
    else if (this.magnitude==arg0.magnitude) 
     ret= 0; 
    else if (this.magnitude<arg0.magnitude) 
     ret= -1; 
    return ret; 
} 

magnitude est un attribut avec le type de données à double dans mon programme. Cela triait ma classe définie freq dans l'ordre inverse par sa magnitude. Donc, pour corriger cela, vous changez les valeurs retournées par les < et >. Cela vous donne les éléments suivants:

public int compareTo(freq arg0) 
{ 
    int ret=0; 
    if(this.magnitude>arg0.magnitude) 
     ret= -1; 
    else if (this.magnitude==arg0.magnitude) 
     ret= 0; 
    else if (this.magnitude<arg0.magnitude) 
     ret= 1; 
    return ret; 
} 

Pour utiliser ce compareTo, nous appelons simplement Arrays.sort(mFreq) qui vous donnera le tableau trié freq [] mFreq. La beauté (à mon avis) de cette solution est qu'elle peut être utilisée pour trier les classes définies par l'utilisateur, et même plus que les trier par un attribut spécifique. Si la mise en œuvre d'une interface comparable vous semble décourageante, je vous encourage à ne pas penser ainsi, ce n'est pas le cas. Ce link on how to implement comparable a rendu les choses beaucoup plus faciles pour moi. Espérant que les gens peuvent faire usage de cette solution, et que votre joie sera même comparable au mien.

3
array.sort(function(a, b) {return b - a;}); //descending 

ou

array.sort(function(a, b) {return a - b;}); //ascending 
0

Je sais que c'est un fil assez vieux, mais est ici une version mise à jour pour Entiers et Java 8:

Arrays.sort(array, (o1, o2) -> o2 - o1); 

Notez qu'il est « o1 - o2 "pour l'ordre croissant normal (ou Comparator.comparingInt()).

Cela fonctionne également pour tous les autres types d'objets. Dis:

Arrays.sort(array, (o1, o2) -> o2.getValue() - o1.getValue());