Tri des valeurs de l’ensemble

J’essaie de sortinger les éléments d’un ensemble mais je suis incapable de le faire jusqu’à présent. voici mon code que j’essaie de faire

public static void main(Ssortingng [] args){ Set set=new HashSet(); set.add("12"); set.add("15"); set.add("5"); List list=asSortedList(set); } public static <T extends Comparable> List asSortedList(Collection c) { List list = new ArrayList(c); Collections.sort(list); return list; } 

mais tel ou tel moyen ne fonctionne pas, car il me donne toujours le même ordre dans lequel ils ont été remplis 12,15,5

Si vous sortingez les chaînes "12" , "15" et "5" "5" vient en dernier parce que "5" > "1" . en d’autres termes, l’ordre naturel des chaînes ne fonctionne pas comme prévu.

Si vous souhaitez stocker des chaînes dans votre liste mais les sortinger numériquement, vous devrez utiliser un comparateur qui gère cela. par exemple

 Collections.sort(list, new Comparator() { public int compare(Ssortingng o1, Ssortingng o2) { Integer i1 = Integer.parseInt(o1); Integer i2 = Integer.parseInt(o2); return (i1 > i2 ? -1 : (i1 == i2 ? 0 : 1)); } }); 

En outre, je pense que vous êtes légèrement mélangé entre les types de Collection . Un HashSet et un HashMap sont des choses différentes.

Utilisez un SortedSet (TreeSet est celui par défaut):

 SortedSet set=new TreeSet(); set.add("12"); set.add("15"); set.add("5"); List list=new ArrayList(set); 

Aucun code de sorting supplémentaire n’est nécessaire.

Oh, je vois que vous voulez un ordre de sorting différent. Fournissez un comparateur au TreeSet:

 new TreeSet(Comparator.comparing(Integer::valueOf)); 

Votre TreeSet va maintenant sortinger les chaînes dans un ordre numérique (ce qui implique qu’il jettera des exceptions si vous fournissez des chaînes non numériques)

Référence:

  • Java Tutorial ( Collections Trail ):
    • Commande d’objects
    • L’interface SortedSet
  • Javadocs: TreeSet
  • Javadocs: Comparator

Vous utilisez le comparateur par défaut pour sortinger un Set . Dans ce cas, cela signifie un ordre lexicographique . Lexicographiquement, "12" vient avant "15" , vient avant "5" .

Utilisez soit un Set :

 Set set=new HashSet(); set.add(12); set.add(15); set.add(5); 

Ou utilisez un comparateur différent:

 Collections.sort(list, new Comparator() { public int compare(Ssortingng a, Ssortingng b) { return Integer.parseInt(a) - Integer.parseInt(b); } }); 

Utilisez la classe wrapper Integer place de Ssortingng car elle effectue le travail difficile en implémentant Comparable . Puis java.util.Collections.sort(list); ferait le tour.

Les chaînes sont sortingées lexicographiquement . Le comportement que vous voyez est correct.

Définissez votre propre comparateur pour sortinger les chaînes comme vous le souhaitez.

Cela fonctionnerait aussi comme prévu (5 comme premier élément) si vous avez changé vos collections en Integer au lieu d’utiliser Ssortingng.

Vous devez passer une instance de comparateur à la méthode de sorting, sinon les éléments seront sortingés dans leur ordre naturel.

Pour plus d’informations, consultez Collections.sort (Liste, Comparateur)