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

편집 : : 문자열 생성자 호출 다음에 Arrays.sort 다음

String s = "edcba" -> "abcde" 

답변

174

toCharArray 문자열이 서로 게이트 쌍 또는 참으로 복합 문자 (악센트 + 전자 등이 포함 된 경우 tackline가 지적 하듯이,이 오류가 발생합니다 별도의 문자) 등등. 그 시점에서 그것은 더 어려워지고 ... 잘하면 당신이 필요하지 않습니다 :) 또한, 이것은 단지 대문자, 악센트 또는 다른 것을 고려하지 않고 서수에 의해 순서입니다.

+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àé"로 정렬하지만, 예를 들어 영어 (미국) 로켈에서는 "aAàbBcCdDeé"를 얻는 것이 더 바람직합니다. – eljenso

46

아니요 내장 String 메서드가 없습니다. char 배열로 변환하고 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é" 
    } 
} 
+0

FYI :이 메서드는 32 비트 코드 포인트를 값이 0xFFFF보다 큰 두 유니 코드 문자로 분할하여 잘못된 값으로 문자열을 만듭니다. 프랑스어에서는 문제가되지 않지만 일부 로캘에서는 문제가 발생할 수 있습니다. – McDowell

+0

참조 Character.isHighSurrogate (char) – McDowell

+1

어떻게 든이 일을 할 것 같아요 ... 그가 스와힐리어 또는 뭔가를 포함하는 문자열을 정렬하지 않는 한 :) – eljenso

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

주 String (소문자 앞에 대문자를 넣음). Comparator를 Sort 메서드에 건네 주어 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

: 길이 하나의 문자열의 흐름과 함께 작동

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

약간 짧은 대안 (정렬되지 않은 String의 각 문자는 Stream에서 String으로 변환됩니다) :

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

절차 :

  1. 처음
  2. 를 인쇄 문자열로 문자열을 문자 배열로 변환 다음 문자
  3. 의 배열을 정렬 배열을
  4. 를 숯불에 문자열을 변환

코드 스 니펫 :

자바 컬렉션을 사용하지 않고
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); 
    } 
} 

출력 :

정렬 == 후

정렬 문자열 ==

를 입력 ginorst