Ordenar una sola cadena en Java

131

¿Hay una forma nativa de ordenar una cadena por su contenido en Java? P.ej

String s = "edcba"  ->  "abcde"
starblue
fuente

Respuestas:

215

toCharArrayseguido de Arrays.sortseguido de una llamada al constructor de cadenas:

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

EDITAR: Como señala la línea de entrada, esto fallará si la cadena contiene pares sustitutos o caracteres compuestos (acento + e como caracteres separados), etc. En ese punto se vuelve mucho más difícil ... espero que no necesites esto :) Además, esto es solo ordenar por ordinal, sin tener en cuenta las mayúsculas, los acentos ni nada más.

Jon Skeet
fuente
2
La forma correcta sería ordenar los puntos de código. Desafortunadamente no hay String.toCodePointArray. (¿En qué orden deberíamos estar clasificando, por cierto?)
Tom Hawtin - tackline 03 de
1
El proyecto ICU describe un método de clasificación UTF-16 de orden de puntos de código: icu-project.org/docs/papers/utf16_code_point_order.html . No creo que Arrays.sort destruya ningún carácter adicional debido a la forma en que se definen los rangos, pero no me cite.
McDowell
1
Tal vez no destruirá nada, pero el orden de clasificación no es óptimo si desea tener en cuenta mayúsculas y acentos, por ejemplo. Este algoritmo clasificará "éDedCBcbAàa" como "ABCDabcdeàé" mientras que, en la configuración regional en inglés (EE. UU.), Por ejemplo, sería más deseable obtener "aAàbBcCdDeé".
eljenso 03 de
1
@YiweiG Y en este caso, la respuesta es: definitivamente no. sortedya es un String... ¿qué esperarías toString()que hiciera?
Jon Skeet
1
@Hengameh: Estás ordenando un conjunto de caracteres, pero luego lo ignoras. Te gustaríachar[] c = s.toCharArray(); Arrays.sort(c); String sorted = new String(c);
Jon Skeet
49

No, no hay un método de cadena incorporado. Puede convertirlo en una matriz de caracteres, ordenarlo usando Arrays.sort y convertirlo nuevamente en una Cadena.

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

O, cuando desee tratar correctamente con cosas específicas de la localidad como mayúsculas y caracteres acentuados:

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é"
  }
}
eljenso
fuente
FYI: este método dividirá los puntos de código de 32 bits en dos: caracteres Unicode con un valor mayor que 0xFFFF, creando cadenas con valores no válidos. No es un problema para el francés, pero puede causar problemas para algunas configuraciones regionales.
McDowell
Ver Character.isHighSurrogate (char)
McDowell
1
De alguna manera creo que esto va a hacer ... a menos que quiera ordenar cadenas que contiene el swahili o algo :)
eljenso
3
"Creo que esto servirá ... a menos que quiera ordenar cadenas que contengan swahili" - Puedo ver el eslogan - Unicode: cuando quieres una manera fácil de localizar y traducir tus aplicaciones a algunos idiomas. Bzzt. Fallar. Hacer las cosas casi bien significa que casi no tienes que corregir un error más tarde.
Jonas Kölker 03 de
@Jonas Dije que creo , a menos que el OP quiera especificar que es absolutamente necesario apoyar Swahili. Incluso prefiero la solución simple sin la configuración regional, de nuevo a menos que el OP indique que no es suficiente. ¿Has oído hablar del principio YAGNI?
eljenso 03 de
32

En Java 8 se puede hacer con:

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

Una alternativa un poco más corta que funciona con una secuencia de cadenas de longitud uno (cada carácter en la cadena sin clasificar se convierte en una cadena en la secuencia) es:

String sorted =
    Stream.of("edcba".split(""))
        .sorted()
        .collect(Collectors.joining());
Marcin
fuente
@Dennis en cuál exactamente y por qué?
Marcin el
El primer bit donde intentas ordenar una cadena. Se ve bien, pero cuando lo ejecuté contra un gran conjunto de datos fue un poco más lento en comparación con la respuesta de Jon Skeets.
Dennis
18

Convertir a matriz de caracteresOrdenarConvertir de nuevo a Cadena :

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"
Maroun
fuente
¿Cuál fue el punto de agregar esta respuesta 4 años después de que otras personas publicaron al menos 3 respuestas idénticas
Nick Cardoso
1
@NickCardoso Realmente no recuerdo, me preguntas sobre una respuesta que publiqué en mis primeras etapas en Stack Overflow. ¿Estás realmente esperando una explicación sobre eso?
Maroun
@ NickCardoso NO estoy tratando de darte una excusa. Su comentario y voto negativo no cambiarán nada por ahora. Eso es lo que decidí hace CUATRO años, no veo cuál es el punto de mencionar esto ahora :)
Maroun
16

Un enfoque más crudo sin usar el método sort Arrays.sort. Esto está usando el tipo de inserción.

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);
}
agaase
fuente
1
la pregunta se hizo de manera nativa en java, sin usar ningún otro algoritmo de ordenación
Vikrant Goel
1
Se votó porque era una solución útil, no porque fuera la respuesta solicitada.
Chris
1
@VikrantGoel "Native way in java": ¿qué no es nativo de este enfoque? No veo ningún requisito de terceros. ¿Vos si?
Nick Cardoso
Esta debería ser la respuesta correcta. Como dijo @NickCardoso ... nada es más "nativo en Java" que esto.
Mariano Zorrilla
14
    String a ="dgfa";
    char [] c = a.toCharArray();
    Arrays.sort(c);
    return new String(c);

Tenga en cuenta que esto no funcionará como se espera si se trata de una cadena de mayúsculas y minúsculas (pondrá mayúsculas antes que minúsculas). Puede pasar un comparador al método Ordenar para cambiar eso.

amit
fuente
1
necesita importar java.util.Arrays; o de lo contrario no funcionará
tolva
3

Procedimiento:

  1. Al principio, convierta la cadena a matriz de caracteres
  2. Luego ordena la matriz de caracteres
  3. Convierta la matriz de caracteres a cadena
  4. Imprime la cadena

Fragmento de código:

    String input = "world";
    char[] arr = input.toCharArray();
    Arrays.sort(arr);
    String sorted = new String(arr);
    System.out.println(sorted);
rashedcs
fuente
¿Esto es una broma? ¿Publicar respuestas idénticas a una pregunta de 8 años? Que vago
Nick Cardoso
Soy ignorante Perdóname.
rashedcs
2

Pregunta: ordenar una cadena 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);
    }
}
Soudipta Dutta
fuente
-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);

}
Tarun Jadhav
fuente
-2

Sin usar Colecciones 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);
    }
}

Salida:

ingrese la cadena ==

clasificación

después de ordenar == ginorst

naveen prasanna
fuente
Deberías mirar de nuevo a> =. ¿Qué pasa con "mnmnmnm" como tu cadena?
Nick Cardoso