Java'da tek bir dizeyi sıralayın


131

Java'da bir Stringi içeriğine göre sıralamanın yerel bir yolu var mı? Örneğin

String s = "edcba"  ->  "abcde"

Yanıtlar:


215

toCharArrayve Arrays.sortardından bir String yapıcı çağrısı gelir:

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

DÜZENLEME: Tackline'ın da işaret ettiği gibi, dizge vekil çiftler veya aslında bileşik karakterler (ayrı karakterler olarak vurgu + e) ​​içeriyorsa bu başarısız olacaktır. Bu noktada çok daha zorlaşır ... umarım buna ihtiyacınız yoktur :) Ek olarak, bu sadece büyük harf, aksan veya başka herhangi bir şey hesaba katılmadan sıraya göre sıralanmasıdır.


2
Doğru yol, kod noktalarını sıralamak olacaktır. Maalesef String.toCodePointArray yok. (Hangi sıraya göre sıralama yapmalıyız, btw?)
Tom Hawtin - tackline

1
ICU projesi bir kod noktası sırası UTF-16 sıralama yöntemini açıklar : icu-project.org/docs/papers/utf16_code_point_order.html . Arrays.sort'un, aralıkların tanımlanma şekli nedeniyle herhangi bir ek karakteri yok edeceğini sanmıyorum, ancak benden alıntı yapmayın.
McDowell

1
Belki hiçbir şeyi yok etmeyecektir, ancak örneğin büyük harfleri ve aksanları hesaba katmak istiyorsanız sıralama düzeni optimal değildir. Bu algoritma, "éDedCBcbAàa" yı "ABCDabcdeàé" olarak sıralayacakken, örneğin İngilizce (ABD) yerel ayarında "aAàbBcCdDeé" elde etmek daha cazip olacaktır.
eljenso

1
@YiweiG Ve bu durumda cevap: kesinlikle hayır. sortedzaten bir String... ne toString()yapmasını beklersiniz ?
Jon Skeet

1
@Hengameh: Bir karakter dizisini sıralıyorsunuz ama sonra görmezden geliyorsunuz. Sen istersinchar[] c = s.toCharArray(); Arrays.sort(c); String sorted = new String(c);
Jon Skeet

49

Yerleşik bir String yöntemi yoktur. Bunu bir char dizisine dönüştürebilir, Arrays.sort kullanarak sıralayabilir ve bunu bir String'e dönüştürebilirsiniz.

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

Veya büyük harf ve aksanlı karakterler gibi yerel ayara özgü şeylerle doğru bir şekilde ilgilenmek istediğinizde:

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

Bilginize: Bu yöntem, 32 bit kod noktalarını 0xFFFF'den büyük bir değere sahip Unicode karakterlerini ikiye bölerek geçersiz değerlere sahip dizeler oluşturur. Fransızca için bir sorun değildir, ancak bazı yerel ayarlar için sorunlara neden olabilir.
McDowell

Character.isHighSurrogate (char)
McDowell

1
Swahili veya başka bir şey içeren Dizeleri sıralamak istemediği sürece bir şekilde bunun işe yarayacağını düşünüyorum :)
eljenso

3
"Swahili içeren Dizeleri sıralamak istemediği sürece bunun işe yarayacağını düşünüyorum" - sloganını görebiliyorum - Unicode: uygulamalarınızı yerelleştirmenin ve bazı dillere çevirmenin kolay bir yolunu istediğinizde . Bzzt. Başarısız. Bir şeyi neredeyse doğru yapmak, daha sonra düzeltmeniz gereken bir hatanın neredeyse olmadığı anlamına gelir .
Jonas Kölker

@Jonas , OP, Swahili'yi desteklemenin kesinlikle gerekli olduğunu belirtmek istemediği sürece, düşünüyorum . OP yeterli olmadığını belirtmedikçe, yerel ayar olmadan basit çözümü bile tercih ederim. YAGNI prensibini hiç duydunuz mu?
eljenso

33

Java 8'de şu şekilde yapılabilir:

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

Bir uzunluktaki Dizeler Akışı ile çalışan biraz daha kısa bir alternatif (sıralanmamış Dize'deki her karakter, Akışta bir Dize'ye dönüştürülür):

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

@Dennis tam olarak hangisinde ve neden?
Marcin

Bir Stringi sıralamayı denediğiniz ilk bit. İyi görünüyor ama onu büyük bir veri setine karşı çalıştırdığımda Jon Skeets cevabına kıyasla biraz daha yavaştı.
Dennis

18

Karakter dizisine dönüştürSıralaDizeye geri dönüştür :

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"

Diğer insanlar en az 3 aynı cevabı gönderdikten 4 yıl sonra bu cevabı eklemenin amacı neydi
Nick Cardoso

1
@NickCardoso Gerçekten hatırlamıyorum, Stack Overflow'daki ilk aşamalarımda yayınladığım cevabı soruyorsunuz. Gerçekten bununla ilgili bir açıklama mı bekliyorsunuz?
Maroun

@NickCardoso ben değilim DEĞİL tüm sizin için bir bahane sağlamak için çalışıyor. Yorumunuz ve olumsuz oyunuz şimdilik hiçbir şeyi değiştirmeyecek. DÖRT yıl önce buna karar verdim, şimdi bunu gündeme getirmenin ne anlamı var
anlamıyorum

16

Sort Arrays.sort yöntemini kullanmadan daha ham bir yaklaşım. Bu, eklemeli sıralama kullanıyor.

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
soru başka bir sıralama algoritması kullanmadan javada Yerel yol olarak soruldu.
Vikrant Goel

1
İstenen cevap olduğu için değil, yararlı bir çözüm olduğu için oy verildi.
Chris

1
@VikrantGoel "Java'da yerel yol" - bu yaklaşımda yerel olmayan nedir? herhangi bir 3. taraf gereksinimi görmüyorum. Yapıyor musun?
Nick Cardoso

Bu doğru cevap olmalı. @NickCardoso'nun dediği gibi ... hiçbir şey bundan daha "java'da doğal bir yol" değildir.
Mariano Zorrilla

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

Karma harfli bir String ise bunun beklendiği gibi çalışmayacağını unutmayın (Küçük harften önce büyük harf koyar). Bunu değiştirmek için Sıralama yöntemine bir karşılaştırıcı geçirebilirsiniz.


1
java.util.Arrays içe aktarmanız gerekir; yoksa işe yaramaz
hopper

3

Prosedür:

  1. İlk önce dizeyi char dizisine dönüştür
  2. Ardından karakter dizisini sıralayın
  3. Karakter dizisini dizeye dönüştür
  4. Dizeyi yazdır

Kod pasajı:

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

Bu bir şaka mı? 8 yaşında bir soruya aynı cevapları mı gönderiyorsunuz? Ne kadar tembel.
Nick Cardoso

Ben cahilim Beni affet.
rashedcs

2

Soru: Java'da bir dizeyi sıralayın

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'da Koleksiyonları kullanmadan:

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

Çıktı:

dizeyi girin ==

sıralama

sıraladıktan sonra == ginorst


> = 'Ye tekrar bakmalısınız. Diziniz olarak "mnmnmnm" ye ne olur?
Nick Cardoso
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.