Сортировка одной строки в Java

131

Есть ли собственный способ отсортировать строку по ее содержимому в java? Например

String s = "edcba"  ->  "abcde"
starblue
источник

Ответы:

216

toCharArrayза которым Arrays.sortследует вызов конструктора 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);
    }
}

РЕДАКТИРОВАТЬ: как указывает tackline, это не удастся, если строка содержит суррогатные пары или действительно составные символы (акцент + e как отдельные символы) и т.д. В этот момент становится намного сложнее ... надеюсь, вам это не нужно :) Кроме того, это просто порядок по порядку, без учета заглавных букв, акцентов или чего-либо еще.

Джон Скит
источник
2
Правильный способ - отсортировать кодовые точки. К сожалению, String.toCodePointArray отсутствует. (В каком порядке мы должны сортировать, кстати?)
Том Хотин - tackline
1
Проект ICU описывает метод сортировки UTF-16 порядка кодовых точек: icu-project.org/docs/papers/utf16_code_point_order.html . Я не думаю, что Arrays.sort уничтожит какие-либо дополнительные символы из-за способа определения диапазонов, но не цитируйте меня.
McDowell,
1
Возможно, это ничего не разрушит, но порядок сортировки не оптимален, если вы хотите, например, учитывать прописные буквы и акценты. Этот алгоритм будет отсортировать «éDedCBcbAàa» как «ABCDabcdeàé», в то время как, например, для английского языка (США) было бы более желательно получить «aAàbBcCdDeé».
eljenso 03
1
@YiweiG И в этом случае ответ: определенно нет. sortedуже String... что вы ожидаете toString()от него?
Джон Скит,
1
@Hengameh: вы сортируете массив символов, но затем игнорируете его. Вы бы хотелиchar[] c = s.toCharArray(); Arrays.sort(c); String sorted = new String(c);
Джон Скит
49

Нет встроенного метода String. Вы можете преобразовать его в массив символов, отсортировать его с помощью Arrays.sort и преобразовать обратно в строку.

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

Или, если вы хотите правильно работать с вещами, зависящими от локали, такими как прописные буквы и символы с диакритическими знаками:

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
источник
FYI: этот метод разделит 32-битные кодовые точки на две - символы Unicode со значением больше 0xFFFF, создавая строки с недопустимыми значениями. Это не проблема для французского языка, но может вызвать проблемы для некоторых стран.
McDowell
См. Character.isHighSurrogate (символ)
МакДауэлл
2
Каким-то образом я думаю, что это подойдет ... если только он не захочет сортировать строки, содержащие суахили или что-то в этом роде :)
eljenso
3
«Я думаю, это подойдет ... если только он не захочет сортировать строки, содержащие суахили» - я вижу слоган - Unicode: когда вам нужен простой способ локализации и перевода ваших приложений на некоторые языки. Bzzt. Потерпеть поражение. Делая вещь почти правильные средства вы почти не имеют ошибку исправить позже.
Йонас Кёлькер, 03
1
@Jonas Я сказал, что думаю , если ОП не хочет указать, что поддержка суахили абсолютно необходима. Я даже предпочитаю простое решение без локали, опять же, если OP не заявляет, что этого недостаточно. Вы когда-нибудь слышали о принципе ЯГНИ?
eljenso 03
33

В Java 8 это можно сделать с помощью:

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

Несколько более короткая альтернатива, которая работает с Stream of Strings длиной один (каждый символ в несортированной String преобразуется в String в Stream):

String sorted =
    Stream.of("edcba".split(""))
        .sorted()
        .collect(Collectors.joining());
Marcin
источник
@ Деннис, на каком именно и почему?
Marcin
Первый бит, в котором вы пытаетесь отсортировать String. Выглядит хорошо, но когда я запускал его для большого набора данных, он был немного медленнее по сравнению с ответом Джона Скитса.
Деннис
18

Преобразовать в массив символовСортировкаПреобразовать обратно в строку :

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"
Марун
источник
Какой смысл добавлять этот ответ через 4 года после того, как другие люди опубликовали по крайней мере 3 идентичных ответа
Ник Кардосо
1
@NickCardoso Я действительно не помню, вы спрашиваете меня об ответе, который я опубликовал на самых ранних этапах своей работы на Stack Overflow. Вы действительно ждете объяснений по этому поводу?
Maroun
@NickCardoso Я вовсе НЕ пытаюсь извинить вас. Ваш комментарий и голос против пока ничего не меняют. Это то, что я решил ЧЕТЫРЕ года назад, я не понимаю, какой смысл поднимать эту тему сейчас :)
Maroun
16

Более грубый подход без использования метода sort Arrays.sort. Это использует сортировку вставкой.

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
источник
1
вопрос задан для собственного способа в java, не используя какой-либо другой алгоритм сортировки.
Викрант Гоэль
1
Проголосовал, потому что это было полезное решение, а не потому, что это был запрошенный ответ.
Крис
1
@VikrantGoel "Нативный способ в java" - что не в этом подходе? я не вижу никаких сторонних требований. Вы?
Ник Кардосо
Это должен быть правильный ответ. Как сказал @NickCardoso ... нет ничего более "родного пути в java", чем это.
Mariano Zorrilla
14
    String a ="dgfa";
    char [] c = a.toCharArray();
    Arrays.sort(c);
    return new String(c);

Обратите внимание, что это не будет работать должным образом, если это String со смешанным регистром (он будет ставить верхний регистр перед нижним). Вы можете передать компаратор методу Sort, чтобы это изменить.

Амит
источник
1
вам нужен import java.util.Arrays; а то не получится
hopper
3

Процедура :

  1. Сначала преобразуйте строку в массив символов
  2. Затем отсортируйте массив символов
  3. Преобразуйте массив символов в строку
  4. Распечатайте строку

Фрагмент кода:

    String input = "world";
    char[] arr = input.toCharArray();
    Arrays.sort(arr);
    String sorted = new String(arr);
    System.out.println(sorted);
rashedcs
источник
Это шутка? Размещаете идентичные ответы на вопрос 8-летней давности? Как лениво.
Ник Кардосо
Я невежественен. Прости меня.
rashedcs
2

Вопрос: отсортировать строку в 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

Без использования коллекций в 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);
    }
}

Вывод:

введите строку ==

сортировка

после сортировки == ginorst

навин прасанна
источник
Вы должны снова посмотреть на> =. Что происходит с "mnmnmnm" в качестве строки?
Ник Кардосо