Trier une seule chaîne en Java


131

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

String s = "edcba"  ->  "abcde"

Réponses:


215

toCharArraysuivi de Arrays.sortsuivi 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 substitution ou même des caractères composites (accent + e comme caractères séparés) etc. À ce stade, cela devient beaucoup plus difficile ... j'espère que vous n'en avez pas besoin :) De plus, il s'agit simplement de classer par ordinal, sans prendre en compte les majuscules, les accents ou quoi que ce soit d'autre.


2
La bonne façon serait de trier les points de code. Malheureusement, il n'y a pas de String.toCodePointArray. (Dans quel ordre devrions-nous trier, au fait?)
Tom Hawtin - Tackline

1
Le projet ICU décrit une méthode de tri UTF-16 par ordre de point de code: icu-project.org/docs/papers/utf16_code_point_order.html . Je ne pense pas que Arrays.sort détruira les caractères supplémentaires en raison de la façon dont les plages sont définies, mais ne me citez pas.
McDowell

1
Cela ne détruira peut-être rien, mais l'ordre de tri n'est pas optimal si vous voulez prendre en compte les majuscules et les accents par exemple. Cet algorithme triera "éDedCBcbAàa" comme "ABCDabcdeàé" alors que, dans les paramètres régionaux anglais (US) par exemple, il serait plus souhaitable d'obtenir "aAàbBcCdDeé".
eljenso

1
@YiweiG Et dans ce cas, la réponse est: certainement pas. sortedest déjà un String... qu'est-ce que vous attendez de lui faire appel toString()?
Jon Skeet

1
@Hengameh: Vous triez un tableau de caractères, mais vous l'ignorez ensuite. Vous voudriezchar[] c = s.toCharArray(); Arrays.sort(c); String sorted = new String(c);
Jon Skeet

49

Non, il n'y a pas de méthode String intégrée. Vous pouvez le convertir en tableau de caractères, le trier à l'aide de Arrays.sort et le reconvertir en chaîne.

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

Ou, lorsque vous souhaitez traiter correctement des éléments spécifiques aux paramètres régionaux tels que 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é"
  }
}

FYI: cette méthode divisera les points de code 32 bits en deux - caractères Unicode avec une valeur supérieure à 0xFFFF, créant des chaînes avec des valeurs non valides. Ce n'est pas un problème pour le français, mais peut causer des problèmes pour certains paramètres régionaux.
McDowell

Voir Character.isHighSurrogate (char)
McDowell

1
D'une manière ou d'une autre, je pense que cela fera l'affaire ... à moins qu'il ne veuille trier les chaînes contenant du swahili ou quelque chose du
genre

3
"Je pense que cela fera l'affaire ... à moins qu'il ne veuille trier les chaînes contenant du swahili" - Je peux voir le slogan - Unicode: quand vous voulez un moyen facile de localiser et de traduire vos applications dans certaines langues. Bzzt. Échouer. Faire les choses presque correctement signifie que vous n'avez presque pas de bogue à corriger plus tard.
Jonas Kölker

@Jonas J'ai dit que je pense , à moins que l'OP ne veuille préciser qu'il est absolument nécessaire de soutenir le swahili. Je préfère même la solution simple sans les paramètres régionaux, encore une fois à moins que l'OP indique que ce n'est pas suffisant. Avez-vous déjà entendu parler du principe YAGNI?
eljenso

33

Dans 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 chaîne dans le flux) est:

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

@Dennis sur lequel exactement et pourquoi?
Marcin

Le premier bit où vous essayez de trier une chaîne. Cela a l'air bien, mais quand je l'ai exécuté sur un grand ensemble de données, c'était un peu plus lent que la réponse de Jon Skeets.
Dennis

18

Convertir en tableau de caractèresTrierReconvertir en chaîne :

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"

Quel était l'intérêt d'ajouter cette réponse 4 ans après que d'autres personnes aient publié au moins 3 réponses identiques
Nick Cardoso

1
@NickCardoso Je ne me souviens vraiment pas, vous me posez une question sur une réponse que j'ai publiée à mes tout débuts sur Stack Overflow. Attendez-vous vraiment des explications à ce sujet?
Maroun

@NickCardoso Je n'essaye PAS du tout de vous fournir une excuse. Votre commentaire et votre vote négatif ne changeront rien pour le moment. C'est ce que j'ai décidé il y a QUATRE ans, je ne vois pas à quoi ça sert d'en
parler

16

Une approche plus brute sans utiliser la méthode sort Arrays.sort. Ceci utilise 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);
}

1
la question posée de manière native en java, n'utilisant aucun autre algorithme de tri.
Vikrant Goel

1
Voté parce que c'était une solution utile, pas parce que c'était la réponse demandée.
Chris

1
@VikrantGoel "Méthode native en Java" - Qu'est-ce qui n'est pas natif dans cette approche? je ne vois aucune exigence de tiers. Le faites vous?
Nick Cardoso

Cela devrait être la bonne réponse. Comme @NickCardoso l'a dit ... rien n'est plus "de manière native en java" que ça.
Mariano Zorrilla

14
    String a ="dgfa";
    char [] c = a.toCharArray();
    Arrays.sort(c);
    return new String(c);

Notez que cela ne fonctionnera pas comme prévu s'il s'agit d'une chaîne à casse mixte (elle mettra les majuscules avant les minuscules). Vous pouvez passer un comparateur à la méthode Sort pour changer cela.


1
vous avez besoin d'import java.util.Arrays; ou bien cela ne fonctionnera pas
hopper

3

Procédure:

  1. Au début, convertissez la chaîne en tableau de caractères
  2. Puis triez le tableau de caractères
  3. Convertir le tableau de caractères en chaîne
  4. Imprimer la chaîne

Extrait de code:

    String input = "world";
    char[] arr = input.toCharArray();
    Arrays.sort(arr);
    String sorted = new String(arr);
    System.out.println(sorted);

Est-ce une farce? Poster des réponses identiques à une question de 8 ans? Comment paresseux.
Nick Cardoso

Je suis ignorant. Pardonne-moi.
rashedcs

2

Question: trier une chaîne en java

public class SortAStringInJava {
    public static void main(String[] args) {

        String str = "Protijayi";
// Method 1
        str = str.chars() // IntStream
                .sorted().collect(StringBuilder::new, StringBuilder::appendCodePoint, StringBuilder::append).toString();

        System.out.println(str);
        // Method 2
        str = Stream.of(str.split(" ")).sorted().collect(Collectors.joining());
        System.out.println(str);
    }
}

-1
public static void main(String[] args) {
    String str = "helloword";   
    char[] arr;
    List<Character> l = new ArrayList<Character>();
    for (int i = 0; i < str.length(); i++) {
        arr = str.toCharArray();
        l.add(arr[i]);

    }
    Collections.sort(l);
    str = l.toString();
    System.out.println(str);
    str = str.replaceAll("\\[", "").replaceAll("\\]", "")
            .replaceAll("[,]", "");
    System.out.println(str);

}

-2

Sans utiliser les collections en Java:

import java.util.Scanner;

public class SortingaString {
    public static String Sort(String s1)
    {
        char ch[]=s1.toCharArray();         
        String res=" ";
        
        for(int i=0; i<ch.length ; i++)
        {
            for(int j=i+1;j<ch.length; j++)
            {
                if(ch[i]>=ch[j])
                {
                    char m=ch[i];
                    ch[i]=ch[j];
                    ch[j]=m;
                }
            }
            
            res=res+ch[i];
            
        }

        return res;
    }

    public static void main(String[] args) {
        Scanner sc=new Scanner(System.in);
        System.out.println("enter the string");
        
        String s1=sc.next();
        String ans=Sort( s1);
        
        System.out.println("after sorting=="+ans);
    }
}

Production:

entrez la chaîne ==

tri

après le tri == ginorst


Vous devriez revoir> =. Que se passe-t-il avec "mnmnmnm" comme chaîne?
Nick Cardoso
En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.