2009-03-03 11 views
97

文字列をjavaの内容でソートするネイティブな方法はありますか?例えば。Javaで単一の文字列を並べ替える

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:tacklineが指摘するように、文字列は、サロゲートペアまたは実際の複合文字(アクセント+ Eなどが含まれている場合、これは失敗するStringコンストラクタの呼び出しに続いてArrays.sort続い

String s = "edcba" -> "abcde" 

答えて

174

toCharArray別の文字)など。その時点では、それはもっと難しくなります。うまくいけば、あなたはこれを必要としません:)さらに、これは大文字小文字、アクセントまたは何かを考慮に入れることなく序数で順序付けしています。

+2

正しい方法はコードポイントをソートすることです。残念ながら、String.toCodePointArrayはありません。 (どのような順序でソートする必要がありますか?btw?) –

+1

ICUプロジェクトでは、コードポイント順UTF-16ソート方法について説明しています。http://icu-project.org/docs/papers/utf16_code_point_order.html私はArrays.sortが範囲が定義されている方法のために補助文字を破壊するとは思わないが、私には引用しない。 – McDowell

+1

これはおそらく何も破壊しませんが、大文字とアクセントなどを考慮したい場合はソート順が最適ではありません。このアルゴリズムは "éDedCBcbAàa"を "ABCDabcdeà"と分類しますが、英語(US)ロケールでは "aAàbBcCdDeé"を取得する方が望ましいでしょう。 – eljenso

46

いいえ組み込みのStringメソッドはありません。これをchar配列に変換し、Arrays.sortを使ってソートし、それをStringに変換することができます。

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

FYI:このメソッドは、32ビットコードポイントを0xFFFFより大きい値を持つ2つのUnicode文字に分割し、無効な値を持つ文字列を作成します。フランス語では問題ありませんが、一部のロケールで問題が発生する可能性があります。 – McDowell

+0

Character.isHighSurrogate(char)を参照してください – McDowell

+1

スワヒリなどの文字列をソートしたい場合を除いて、どういうわけか... – eljenso

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

注意文字列(小文字の前に大文字を入れます)。 ComparatorをSortメソッドに渡して、それを変更することができます。

+1

import java.util.Arraysが必要です。それ以外の場合は動作しません –

12

並べ替えを使用せずに、より生のアプローチ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); 
} 
+1

質問Javaのネイティブな方法を求めて、他のソートアルゴリズムを使用していません。 –

+1

これは有用な解決策であったため投票しました。要求された回答であったわけではありません。 – Chris

13

Convert to array of charsConvert back to StringSort→:

それはで行うことができるJava 8で
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

:長さ1の文字列のストリームで動作します

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

A少し短い代替(ソートされていないStringの各文字はStreamのStringに変換されます)

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

手順:

  1. 最初に
  2. 印刷文字列に文字列を文字列に変換後の文字
  3. の配列をソート配列に
  4. をcharに文字列を変換

コードスニペット:

Javaでコレクションを使用せずに、
String input = "world"; 
    char[] arr = input.toCharArray(); 
    Arrays.sort(arr); 
    String sorted = new String(arr); 
    System.out.println(sorted); 
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

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