Ordina una singola stringa in Java


131

Esiste un modo nativo per ordinare una stringa in base al suo contenuto in Java? Per esempio

String s = "edcba"  ->  "abcde"

Risposte:


215

toCharArrayseguito da Arrays.sortseguito da una chiamata del costruttore 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: Come sottolineato da tackline, questo fallirà se la stringa contiene coppie surrogate o caratteri davvero compositi (accento + e come caratteri separati) ecc. A quel punto diventa molto più difficile ... speriamo che non ti serva :) Inoltre, questo è solo un ordinamento ordinale, senza tener conto di maiuscole, accenti o altro.


2
Il modo corretto sarebbe quello di ordinare i punti di codice. Sfortunatamente non esiste String.toCodePointArray. (In quale ordine dovremmo scegliere, tra l'altro?)
Tom Hawtin - affronta il

1
Il progetto ICU descrive un metodo di ordinamento UTF-16 in ordine di codice : icu-project.org/docs/papers/utf16_code_point_order.html . Non credo che Arrays.sort distruggerà eventuali caratteri supplementari a causa del modo in cui sono definiti gli intervalli, ma non citarmi.
McDowell,

1
Forse non distruggerà nulla, ma l'ordinamento non è ottimale se si desidera prendere in considerazione lettere maiuscole e accenti, ad esempio. Questo algoritmo ordinerà "éDedCBcbAàa" come "ABCDabcdeàé" mentre, ad esempio, nella locale inglese (USA), sarebbe più desiderabile ottenere "aAàbBcCdDeé".
eljenso

1
@YiweiG E in questo caso, la risposta è: sicuramente no. sortedè già un String... cosa ti aspetteresti toString()di fare?
Jon Skeet,

1
@Hengameh: stai ordinando un array di caratteri, ma poi lo ignori. Vorrestichar[] c = s.toCharArray(); Arrays.sort(c); String sorted = new String(c);
Jon Skeet il

49

No, non esiste un metodo String incorporato. È possibile convertirlo in un array di caratteri, ordinarlo utilizzando Arrays.sort e convertirlo nuovamente in una stringa.

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

Oppure, quando vuoi trattare correttamente cose specifiche della locale come caratteri maiuscoli e accentati:

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

Cordiali saluti: questo metodo dividerà punti di codice a 32 bit in due: caratteri Unicode con un valore maggiore di 0xFFFF, creando stringhe con valori non validi. Non è un problema per il francese, ma può causare problemi in alcune località.
McDowell,

Vedi Character.isHighSurrogate (char)
McDowell

1
In qualche modo penso che questo farà ... a meno che non voglia ordinare stringhe contenenti Swahili o qualcosa di simile :)
eljenso

3
"Penso che questo farà ... a meno che non voglia ordinare stringhe contenenti Swahili" - Vedo lo slogan - Unicode: quando vuoi un modo semplice per localizzare e tradurre le tue applicazioni in alcune lingue. Bzzt. Fallire. Fare le cose quasi bene significa che non hai quasi un bug da correggere in seguito.
Jonas Kölker

@Jonas Ho detto che penso , a meno che l'OP non voglia specificare che è assolutamente necessario supportare Swahili. Preferisco anche la soluzione semplice senza le impostazioni locali, a meno che l'OP non dichiari che non è sufficiente. Hai mai sentito parlare del principio YAGNI?
eljenso

33

In Java 8 si può fare con:

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

Un'alternativa leggermente più breve che funziona con un flusso di stringhe di lunghezza uno (ogni carattere nella stringa non ordinata viene convertito in una stringa nello stream) è:

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

@Dennis su quale esattamente e perché?
Marcin

Il primo bit in cui si tenta di ordinare una stringa. Sembra buono ma quando l'ho eseguito su un set di dati di grandi dimensioni è stato un po 'più lento rispetto alla risposta di Jon Skeets.
Dennis,

18

Converti in array di caratteriOrdinaConverti nuovamente in stringa :

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"

A che serve aggiungere questa risposta 4 anni dopo che altre persone hanno pubblicato almeno 3 risposte identiche
Nick Cardoso,

1
@NickCardoso Non ricordo davvero, mi stai chiedendo una risposta che ho pubblicato nelle mie prime fasi su Stack Overflow. Stai davvero aspettando una spiegazione al riguardo?
Maroun,

@NickCardoso NON sto cercando di fornire una scusa per te. Il tuo commento e il tuo voto negativo non cambieranno nulla per ora. Questo è quello che ho deciso QUATTRO anni fa, non vedo a che serve sollevarlo ora :)
Maroun

16

Un approccio più semplice senza l'utilizzo del metodo sort Arrays.sort. Questo sta usando l'ordinamento per inserzione.

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 domanda chiedeva il modo nativo in Java, non usando nessun altro algoritmo di ordinamento.
Vikrant Goel,

1
Votato perché era una soluzione utile, non perché era la risposta richiesta.
Chris,

1
@VikrantGoel "Native way in java" - cosa non è nativo di questo approccio? non vedo alcun requisito di terze parti. Fai?
Nick Cardoso,

Questa dovrebbe essere la risposta corretta. Come ha detto @NickCardoso ... niente è più "modo nativo in Java" di questo.
Mariano Zorrilla,

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

Nota che questo non funzionerà come previsto se si tratta di una stringa con maiuscole / minuscole (metterà maiuscole prima di minuscole). È possibile passare un comparatore al metodo Sort per modificarlo.


1
devi importare java.util.Arrays; altrimenti non funzionerà
tramoggia

3

Procedura:

  1. Inizialmente converti la stringa in array di caratteri
  2. Quindi ordinare l'array di caratteri
  3. Converti l'array di caratteri in stringa
  4. Stampa la stringa

Snippet di codice:

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

È uno scherzo? Pubblicare risposte identiche a una domanda di 8 anni? Che pigro.
Nick Cardoso,

Sono ignorante. Perdonami.
eruzioni cutanee

2

Domanda: ordina una stringa 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

Senza usare le raccolte 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);
    }
}

Produzione:

inserisci la stringa ==

ordinamento

dopo l'ordinamento == ginorst


Dovresti guardare ancora> =. Cosa succede con "mnmnmnm" come stringa?
Nick Cardoso,
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.