153 votes

Trier une seule chaîne de caractères en Java

Existe-t-il un moyen natif de trier une chaîne de caractères par son contenu en java ? Par exemple

String s = "edcba"  ->  "abcde"

240voto

Jon Skeet Points 692016

toCharArray suivi par Arrays.sort suivi d'un appel au constructeur String :

import java.util.Arrays;

public class Test
{
    public static void main(String[] args)
    {
        String original = "edcba";
        char[] chars = original.toCharArray();
        Arrays.sort(chars);
        String sorted = new String(chars);
        System.out.println(sorted);
    }
}

EDIT : Comme le souligne tackline, cela échouera si la chaîne contient des paires de substituts ou des caractères composites (accent + e comme caractères séparés), etc. A ce stade, cela devient beaucoup plus difficile... j'espère que vous n'en aurez pas besoin :) En outre, il s'agit simplement d'un classement par ordre ordinal, sans tenir compte des majuscules, des accents ou de tout autre élément.

54voto

eljenso Points 7690

Non, il n'y a pas de méthode String intégrée. Vous pouvez le convertir en un tableau de caractères, le trier en utilisant Arrays.sort et le reconvertir en String.

String test= "edcba";
char[] ar = test.toCharArray();
Arrays.sort(ar);
String sorted = String.valueOf(ar);

Ou, lorsque vous voulez traiter correctement des éléments spécifiques à la région comme les majuscules et les caractères accentués :

import java.text.Collator;
import java.util.Arrays;
import java.util.Comparator;
import java.util.Locale;

public class Test
{
  public static void main(String[] args)
  {
    Collator collator = Collator.getInstance(new Locale("fr", "FR"));
    String original = "éDedCBcbAàa";
    String[] split = original.split("");
    Arrays.sort(split, collator);
    String sorted = "";
    for (int i = 0; i < split.length; i++)
    {
      sorted += split[i];
    }
    System.out.println(sorted); // "aAàbBcCdDeé"
  }
}

44voto

Marcin Points 104

En Java 8, cela peut être fait avec :

String s = "edcba".chars()
    .sorted()
    .collect(StringBuilder::new, StringBuilder::appendCodePoint, StringBuilder::append)
    .toString();

Une alternative légèrement plus courte qui fonctionne avec un flux de chaînes de longueur un (chaque caractère de la chaîne non triée est converti en une chaîne dans le flux) est la suivante :

String sorted =
    Stream.of("edcba".split(""))
        .sorted()
        .collect(Collectors.joining());

24voto

Maroun Maroun Points 31217

Convertir en tableau de caractèresTrierReconvertir en String :

String s = "edcba";
char[] c = s.toCharArray();        // convert to array of chars 
java.util.Arrays.sort(c);          // sort
String newString = new String(c);  // convert back to String
System.out.println(newString);     // "abcde"

19voto

agaase Points 333

Une approche plus brute sans utiliser la méthode sort Arrays.sort. Il s'agit d'utiliser le tri par insertion.

public static void main(String[] args){
    String wordSt="watch";
    char[] word=wordSt.toCharArray();

    for(int i=0;i<(word.length-1);i++){
        for(int j=i+1;j>0;j--){
            if(word[j]<word[j-1]){
                char temp=word[j-1];
                word[j-1]=word[j];
                word[j]=temp;
            }
        }
    }
    wordSt=String.valueOf(word);
    System.out.println(wordSt);
}

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X