2009-03-03 12 views
97

Bir String'i java'daki içeriğine göre sıralamak için yerel bir yol var mı? Örneğin.Java'da tek bir String'i sırala

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: bir String yapıcı çağrı ardından Arrays.sort ardından

String s = "edcba" -> "abcde" 

cevap

174

toCharArray dize vekil çiftleri ya da gerçekten de bileşik karakterleri (vurgu + e kadar içeriyorsa tackline işaret ettiği gibi, bu başarısız olur Ayrı chars) vb. Bu noktada çok daha zorlaşıyor ... umarım buna ihtiyacınız yoktur :) Buna ek olarak, bu sadece sıradan, büyük harf kullanımı, aksan veya başka bir şey hesaba katmadan sipariş vermektir.

+2

Doğru yol, kod noktalarını sıralamak olabilir. Maalesef String.toCodePointArray yok. (Hangi sıraya göre sıralanmalıyız, btw?) –

+1

ICU projesi, UTF-16 sıralama yöntemi kod noktası sırasını açıklar: http://icu-project.org/docs/papers/utf16_code_point_order.html. Arrays.sort'un, aralığın tanımlandığı şekilde herhangi bir ek karakteri yok edeceğini sanmıyorum, ama bana teklif verme. – McDowell

+1

Belki bir şeyi yok etmeyebilir, ancak örneğin büyük harf ve aksanları hesaba katmak istiyorsanız sıralama düzeni en uygun değildir. Bu algoritma "éDedCBcbAàa" ı "ABCDabcdeàé" olarak sıralayacaktır, örneğin, İngilizce (ABD) lokasyonunda, "aAàbBcCdDeé" elde etmek daha istenecektir. – eljenso

46

Hayır yerleşik bir String yöntemi yok. 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 ve aksanlı karakterler gibi yerele özgü şeylerle doğru başa istediğinizde: Bu karışık durum buysa, beklendiği gibi bu çalışmaz

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

FYI: bu yöntem, 32 bit kod noktasını ikiye bölünür - Unicode karakterleri 0xFFFF'den büyük bir değerle, geçersiz değerlere sahip dizeler oluşturarak. Fransızca için bir sorun değil, bazı yereller için sorunlara neden olabilir. – McDowell

+0

Character.isHighSurrogate (char) 'a bakın – McDowell

+1

Her nasılsa, bunu Swahili veya başka bir şey içeren dizeleri sıralamak istemedikçe yapacağıma inanıyorum :) – eljenso

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

Not Dize (Küçük harflerden önce büyük harf koyar). Bunu değiştirmek için bir karşılaştırıcıyı Sıralama yöntemine geçirebilirsiniz.

+1

içeriğine ihtiyacınız var java.util.Arrays; ya da işe yaramaz –

12

Arrays.sort yöntemini kullanmadan daha ham bir yaklaşım. Bu, ekleme 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

sorusu, Java'da Native yolunda sorulan soru, başka sıralama algoritması kullanmadan. –

+1

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

13

Convert to array of charsConvert back to StringSort →:

onunla yapılabilir Java 8'de
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);  //Will print "abcde" 
23

: uzunluk biri Strings bir Akış ile çalışır

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

biraz daha kısa bir alternatif (Sıralanmamış String'deki her karakter Akışta bir String'e dönüştürülür):

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

Prosedür:

  1. İlk başta
  2. Yazdır dizeye dize karakter dizisi dönüştürme Sonra karakteri
  3. dizi sıralama dizi
  4. char dize dönüştürmek

Kod snippet'i:

Java Koleksiyonlar kullanarak olmadan
0
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); 

} 
0

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

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ı:

sıralama == sonra

sıralama dize ==

girmek ginorst