Sortieren Sie einen einzelnen String in Java


131

Gibt es eine native Möglichkeit, einen String nach seinem Inhalt in Java zu sortieren? Z.B

String s = "edcba"  ->  "abcde"

Antworten:


215

toCharArraygefolgt von Arrays.sorteinem String-Konstruktor-Aufruf:

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);
    }
}

BEARBEITEN: Wie Tackline hervorhebt, schlägt dies fehl, wenn die Zeichenfolge Ersatzpaare oder zusammengesetzte Zeichen (Akzent + e als separate Zeichen) usw. enthält. An diesem Punkt wird es viel schwieriger ... hoffentlich brauchen Sie das nicht :) Darüber hinaus wird nur nach Ordnungszahl geordnet, ohne Groß- und Kleinschreibung, Akzente oder andere Faktoren zu berücksichtigen.


2
Der richtige Weg wäre, die Codepunkte zu sortieren. Leider gibt es kein String.toCodePointArray. (In welche Reihenfolge sollten wir übrigens sortieren?)
Tom Hawtin - Tackline

1
Das ICU-Projekt beschreibt eine UTF-16- Sortiermethode für die Codepunktreihenfolge: icu-project.org/docs/papers/utf16_code_point_order.html . Ich glaube nicht, dass Arrays.sort zusätzliche Zeichen aufgrund der Definition der Bereiche zerstört, aber zitiere mich nicht.
McDowell

1
Es wird vielleicht nichts zerstören, aber die Sortierreihenfolge ist nicht optimal, wenn Sie beispielsweise Großbuchstaben und Akzente berücksichtigen möchten. Dieser Algorithmus sortiert "éDedCBcbAàa" als "ABCDabcdeàé", während es beispielsweise im englischen Gebietsschema (US) wünschenswerter wäre, "aAàbBcCdDeé" zu erhalten.
Eljenso

1
@YiweiG Und in diesem Fall lautet die Antwort: definitiv nicht. sortedist schon ein String... was würdest du erwarten, wenn du toString()es anrufst?
Jon Skeet

1
@Hengameh: Sie sortieren ein Zeichenarray, ignorieren es dann aber. Sie würden wollenchar[] c = s.toCharArray(); Arrays.sort(c); String sorted = new String(c);
Jon Skeet

49

Nein, es gibt keine integrierte String-Methode. Sie können es in ein char-Array konvertieren, mit Arrays.sort sortieren und wieder in einen String konvertieren.

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

Oder wenn Sie mit länderspezifischen Dingen wie Großbuchstaben und Zeichen mit Akzent richtig umgehen möchten:

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é"
  }
}

Zu Ihrer Information: Diese Methode teilt 32-Bit-Codepunkte in zwei Unicode-Zeichen mit einem Wert größer als 0xFFFF auf und erstellt Zeichenfolgen mit ungültigen Werten. Kein Problem für Französisch, kann aber für einige Länder Probleme verursachen.
McDowell

Siehe Character.isHighSurrogate (char)
McDowell

1
Irgendwie denke ich, dass dies funktionieren wird ... es sei denn, er möchte Strings sortieren, die Suaheli oder etwas enthalten :)
eljenso

3
"Ich denke, das wird funktionieren ... es sei denn, er möchte Strings mit Suaheli sortieren" - Ich kann den Slogan sehen - Unicode: Wenn Sie eine einfache Möglichkeit suchen, Ihre Anwendungen in einige Sprachen zu lokalisieren und zu übersetzen . Bzzt. Scheitern. Wenn Sie etwas fast richtig machen, müssen Sie später fast keinen Fehler mehr beheben.
Jonas Kölker

@ Jonas Ich sagte, ich denke , es sei denn, das OP möchte angeben, dass es absolut notwendig ist, Swahili zu unterstützen. Ich bevorzuge sogar die einfache Lösung ohne das Gebietsschema, es sei denn, das OP gibt an, dass dies nicht ausreicht. Schon mal was vom YAGNI-Prinzip gehört?
Eljenso

32

In Java 8 ist dies möglich mit:

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

Eine etwas kürzere Alternative, die mit einem Stream von Strings der Länge eins funktioniert (jedes Zeichen in der unsortierten Zeichenfolge wird in einen String im Stream konvertiert), ist:

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

@ Tennis auf welchem ​​genau und warum?
Marcin

Das erste Bit, in dem Sie versuchen, einen String zu sortieren. Es sieht gut aus, aber als ich es gegen einen großen Datensatz ausführte, war es im Vergleich zu Jon Skeets Antwort etwas langsamer.
Dennis

18

In Zeichenarray konvertierenSortierenZurück in Zeichenfolge konvertieren :

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"

Was war der Sinn beim Hinzufügen dieser Antwort 4 Jahre nachdem andere Leute mindestens 3 identische Antworten gepostet haben
Nick Cardoso

1
@NickCardoso Ich erinnere mich wirklich nicht, Sie fragen mich nach einer Antwort, die ich in meinen sehr frühen Phasen von Stack Overflow gepostet habe. Warten Sie wirklich auf eine Erklärung dafür?
Maroun

@ NickCardoso Ich versuche NICHT , eine Entschuldigung für dich zu liefern. Ihr Kommentar und Ihre Ablehnung werden vorerst nichts ändern. Das habe ich vor VIER Jahren beschlossen, ich verstehe nicht, wozu das jetzt gut ist :)
Maroun

16

Ein roherer Ansatz ohne Verwendung der sort Arrays.sort-Methode. Dies verwendet die Einfügesortierung.

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
Die Frage nach Native Way in Java, ohne einen anderen Sortieralgorithmus zu verwenden.
Vikrant Goel

1
Abgestimmt, weil es eine nützliche Lösung war, nicht weil es die angeforderte Antwort war.
Chris

1
@VikrantGoel "Native Way in Java" - was ist an diesem Ansatz nicht native? Ich sehe keine Anforderungen von Drittanbietern. Machst du?
Nick Cardoso

Dies sollte die richtige Antwort sein. Wie @NickCardoso sagte ... nichts ist "Native Way in Java" als dies.
Mariano Zorrilla

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

Beachten Sie, dass dies nicht wie erwartet funktioniert, wenn es sich um eine Zeichenfolge in gemischter Groß- und Kleinschreibung handelt (Groß- und Kleinschreibung werden vor Kleinbuchstaben gesetzt). Sie können einen Komparator an die Sortiermethode übergeben, um dies zu ändern.


1
Sie müssen java.util.Arrays importieren. oder es wird nicht funktionieren
Hopper

3

Vorgehensweise:

  1. Konvertieren Sie zuerst die Zeichenfolge in ein char-Array
  2. Sortieren Sie dann das Zeichenarray
  3. Konvertieren Sie das Zeichenarray in eine Zeichenfolge
  4. Drucken Sie die Zeichenfolge

Code-Auszug:

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

Ist das ein Witz? Identische Antworten auf eine 8 Jahre alte Frage posten? Wie faul.
Nick Cardoso

Ich bin unwissend. Vergib mir.
Rashedcs

2

Frage: Sortieren Sie einen String in 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

Ohne Verwendung von Sammlungen in 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);
    }
}

Ausgabe:

Geben Sie den String == ein

Sortierung

nach dem sortieren == ginorst


Sie sollten sich noch einmal> = ansehen. Was passiert mit "mnmnmnm" als String?
Nick Cardoso
Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.