Urutkan satu String di Jawa


131

Apakah ada cara asli untuk mengurutkan String berdasarkan isinya di java? Misalnya

String s = "edcba"  ->  "abcde"

Jawaban:


215

toCharArraydiikuti oleh Arrays.sortdiikuti oleh panggilan konstruktor 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: Seperti yang ditunjukkan oleh tackline, ini akan gagal jika string berisi pasangan pengganti atau memang karakter gabungan (aksen + e sebagai karakter terpisah) dll. Pada titik itu akan menjadi jauh lebih sulit ... semoga Anda tidak membutuhkan ini :) Selain itu, ini hanya dipesan secara ordinal, tanpa memperhitungkan huruf besar, aksen, atau apa pun lainnya.


2
Cara yang benar adalah dengan mengurutkan poin kode. Sayangnya tidak ada String.toCodePointArray. (Order Apa yang harus kita menyortir ke dalam, btw?)
Tom Hawtin - tackline

1
Proyek ICU menjelaskan metode pengurutan titik kode UTF-16: icu-project.org/docs/papers/utf16_code_point_order_order.html . Saya tidak berpikir Arrays.sort akan memusnahkan karakter tambahan apa pun karena cara rentang didefinisikan, tetapi jangan mengutip saya.
McDowell

1
Mungkin tidak akan menghancurkan apa pun, tetapi urutannya tidak optimal jika Anda ingin memperhitungkan huruf besar dan aksen misalnya. Algoritma ini akan mengurutkan "éDedCBcbAàa" sebagai "ABCDabcdeàé" sementara, dalam bahasa Inggris (AS) misalnya, akan lebih diinginkan untuk mendapatkan "aAbbcCdDeé".
eljenso

1
@ YiweiG Dan dalam hal ini, jawabannya adalah: pasti tidak. sortedsudah menjadi String... apa yang Anda harapkan toString()untuk dilakukan?
Jon Skeet

1
@ Hengameh: Anda sedang mengurutkan array karakter, tetapi kemudian mengabaikannya. Anda inginchar[] c = s.toCharArray(); Arrays.sort(c); String sorted = new String(c);
Jon Skeet

49

Tidak, tidak ada metode String bawaan. Anda dapat mengonversinya menjadi array char, mengurutkannya menggunakan Arrays.sort dan mengubahnya kembali menjadi String.

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

Atau, ketika Anda ingin berurusan dengan benar dengan hal-hal spesifik lokal seperti huruf besar dan aksen karakter:

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: metode ini akan membagi poin kode 32bit menjadi dua - karakter Unicode dengan nilai lebih besar dari 0xFFFF, membuat string dengan nilai tidak valid. Bukan masalah untuk Prancis, tetapi dapat menyebabkan masalah untuk beberapa lokal.
McDowell

Lihat Character.isHighSurrogate (char)
McDowell

1
Entah bagaimana saya pikir ini akan melakukan ... kecuali dia ingin menyortir Strings mengandung Swahili atau sesuatu :)
eljenso

3
"Saya pikir ini akan berhasil ... kecuali dia ingin mengurutkan Strings yang mengandung Swahili" - Saya dapat melihat slogan - Unicode: ketika Anda menginginkan cara mudah untuk melokalkan dan menerjemahkan aplikasi Anda ke beberapa bahasa. Bzzt. Gagal. Melakukan hal yang hampir benar berarti Anda hampir tidak memiliki bug untuk diperbaiki nanti.
Jonas Kölker

@Jonas saya katakan saya pikir , kecuali OP ingin menentukan bahwa itu mutlak diperlukan untuk mendukung Swahili. Saya bahkan lebih suka solusi sederhana tanpa lokal, sekali lagi kecuali OP menyatakan bahwa itu tidak cukup. Pernah dengar prinsip YAGNI?
eljenso

32

Di Java 8 dapat dilakukan dengan:

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

Alternatif yang sedikit lebih pendek yang bekerja dengan Stream of Strings of length satu (setiap karakter dalam String yang tidak disortir diubah menjadi String dalam Stream) adalah:

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

@ Dennis yang tepat dan mengapa?
Marcin

Bit pertama di mana Anda mencoba mengurutkan String. Kelihatannya bagus tetapi ketika saya menjalankannya terhadap dataset besar itu sedikit lebih lambat dibandingkan dengan jawaban Jon Skeets.
Dennis

18

Konversi ke berbagai karakterSortirKonversi kembali ke String :

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"

Apa gunanya menambahkan jawaban ini 4 tahun setelah orang lain memposting setidaknya 3 jawaban yang identik
Nick Cardoso

1
@NickCardoso Saya benar-benar tidak ingat, Anda bertanya kepada saya tentang jawaban yang saya posting pada tahap awal saya di Stack Overflow. Apakah Anda benar-benar menunggu penjelasan tentang itu?
Maroun

@NickCardoso Saya TIDAK mencoba memberikan alasan untuk Anda sama sekali. Komentar Anda, dan downvote, tidak akan mengubah apa pun untuk saat ini. Itulah yang saya putuskan EMPAT tahun yang lalu, saya tidak melihat apa gunanya mengemukakan ini sekarang :)
Maroun

16

Pendekatan yang lebih baku tanpa menggunakan metode sort Arrays.sort. Ini menggunakan jenis penyisipan.

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
pertanyaan yang diajukan untuk cara asli di java, tidak menggunakan algoritma pengurutan lainnya.
Vikrant Goel

1
Terpilih karena itu solusi yang bermanfaat, bukan karena itu jawaban yang diminta.
Chris

1
@ VikrantGoel "Cara asli di java" - apa yang tidak asli tentang pendekatan ini? saya tidak melihat persyaratan pihak ke-3. Apakah kamu?
Nick Cardoso

Ini seharusnya jawaban yang benar. Seperti @NickCardoso berkata ... tidak ada yang lebih "cara asli di java" selain ini.
Mariano Zorrilla

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

Perhatikan bahwa ini tidak akan berfungsi seperti yang diharapkan jika itu adalah string case campuran (Ini akan menempatkan huruf besar sebelum huruf kecil). Anda dapat melewati pembanding ke metode Urutkan untuk mengubahnya.


1
Anda perlu mengimpor java.util.Arrays; atau kalau tidak itu tidak akan berhasil
hopper

3

Prosedur:

  1. Pertama-tama konversikan string ke array char
  2. Kemudian urutkan array karakter
  3. Konversi array karakter menjadi string
  4. Cetak string

Cuplikan kode:

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

Apakah ini lelucon? Posting jawaban yang identik dengan pertanyaan 8 tahun? Sangat malas.
Nick Cardoso

Saya bodoh. Maafkan aku.
rashedcs

2

Pertanyaan: urutkan string dalam 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

Tanpa menggunakan Koleksi di Jawa:

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

Keluaran:

masukkan string ==

penyortiran

setelah mengurutkan == ginorst


Anda harus melihat lagi pada> =. Apa yang terjadi dengan "mnmnmnm" sebagai string Anda?
Nick Cardoso
Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.