2011-10-03 2 views
12

이 코드가 있습니다. 그것은 프랑스어와 러시아어로 정확하게 정렬됩니다. Locale.US를 사용했는데 제대로 된 것 같습니다. 이 솔루션이 모든 언어로 가능합니까? 다른 언어에서도 작동합니까? 예 : 중국어, 한국어, 일본어 ... 그렇지 않다면 더 나은 해결책은 무엇입니까?모든 언어로 문자열을 정렬 할 수있는 방법이 있습니까?

public class CollationTest { 
    public static void main(final String[] args) { 
     final Collator collator = Collator.getInstance(Locale.US); 
     final SortedSet<String> set = new TreeSet<String>(collator); 

     set.add("abîmer"); 
     set.add("abîmé"); 
     set.add("aberrer"); 
     set.add("abhorrer"); 
     set.add("aberrance"); 
     set.add("abécédaire"); 
     set.add("abducteur"); 
     set.add("abdomen"); 

     set.add("государственно-монополистический"); 
     set.add("гостить"); 
     set.add("гостевой"); 
     set.add("гостеприимный"); 
     set.add("госпожа"); 
     set.add("госплан"); 
     set.add("господи"); 
     set.add("господа"); 

     for(final String s : set) { 
      System.out.println(s); 
     } 
    } 
} 

업데이트 : 미안 해요, 난 순서로 모든 언어를 포함해야합니다이 설정이 필요하지 않습니다. 나는이 세트가 하나의 언어를 포함하고 모든 언어로 정확하게 정렬된다는 것을 의미합니다.

public class CollationTest { 
    public static void main(final String[] args) { 
     final Collator collator = Collator.getInstance(Locale.US); 
     final SortedSet<String> set = new TreeSet<String>(collator); 

     // Sorting in French. 
     set.clear(); 
     set.add("abîmer"); 
     set.add("abîmé"); 
     set.add("aberrer"); 
     set.add("abhorrer"); 
     set.add("aberrance"); 
     set.add("abécédaire"); 
     set.add("abducteur"); 
     set.add("abdomen"); 
     for(final String s : set) { 
      System.out.println(s); 
     } 

     // Sorting in Russian. 
     set.clear(); 
     set.add("государственно-монополистический"); 
     set.add("гостить"); 
     set.add("гостевой"); 
     set.add("гостеприимный"); 
     set.add("госпожа"); 
     set.add("госплан"); 
     set.add("господи"); 
     set.add("господа"); 
     for(final String s : set) { 
      System.out.println(s); 
     } 
    } 
} 
+4

죄. – Flexo

+3

집합에 하나의 언어 만 포함되어 있어도 정렬 할 때마다 'Collator'에 대해 올바른 'Locale'을 선택해야합니다. –

답변

21

모든 언어에는 고유 한 알파벳순이 있으므로 사용자가 할 수 없습니다. 예를 들어,

러시아어는 명시된대로 с 문자는 터키어와 다른 순서를가집니다.

항상 collator를 사용해야합니다. 내가 당신에게 제안 할 수있는 것은 Collection API입니다. 학습과 정보 확인을 위해

// 
    // Define a collator for German language 
    // 
    Collator collator = Collator.getInstance(Locale.GERMAN); 

    // 
    // Sort the list using Collator 
    // 
    Collections.sort(words, collator); 

here

언급이 프로그램은 두 개의 서로 다른 코레 이타와 단어의 같은 목록을 정렬 할 때 발생할 수있는 표시 등 : 새 (

조합기 fr_FRCollator =는, Collator.getInstance 로케일 ("fr", "FR"));

Collator en_USCollator = Collator.getInstance (새 로케일 ("en", "US")));

sortStrings라고하는 정렬 방법은 모든 Collator에서 사용할 수 있습니다.

복숭아 PECHE PECHE 죄

을 프랑스어의 조합 규칙에 따라 다음과 같이

public static void sortStrings(Collator collator, 
          String[] words) { 
    String tmp; 
    for (int i = 0; i < words.length; i++) { 
     for (int j = i + 1; j < words.length; j++) { 
      if (collator.compare(words[i], words[j]) > 0) { 
       tmp = words[i]; 
       words[i] = words[j]; 
       words[j] = tmp; 
      } 
     } 
     } 
} 

영어 조합기 단어를 정렬하십시오 sortStrings 방법은 비교 메소드를 호출합니다 알 수 있습니다 앞의 목록의 순서가 잘못되었습니다. 프랑스어 péche는 분류 목록에있는 pêche를 따라야합니다. 다음과 같이 프랑스 조합기는 정확하게 단어의 배열을 정렬합니다

복숭아 PECHE PECHE 난 당신이 의미 간 언어 단어의 순서를 정의 할 수 있다고 생각하지 않습니다

1

는 지금까지 내가 중국은 가능한 한 한적한는 히라가나 또는 가타카나의 순서가 그들의 언어에 대한 주문을하지 않아도 알고 있지만 한자는 의문이다. 그러나 컴퓨터에서 모든 일은 언어로 노래하는 것과 동일한 일이 숫자로 표시됩니다. 각 기호는 UNICODE 고유 번호에 해당합니다. 이것이 UNICODE 위치를 사용하여 단어를 정렬 할 수있는 솔루션입니다.

+2

중국어 한자 및 일본어 한자는 급진 및 획수별로 정렬 할 수 있습니다. –

9

사용되는 언어를 정확하게 감지 할 수있는 경우에도 유용한 데이터 정렬 순서는 일반적으로 특정 언어 + 국가 조합에 따라 다릅니다. 또한 언어 + 국가 내에서조차도 사용 또는 특정 사용자 정의에 따라 다를 수 있습니다.

그러나 임의의 텍스트 집합을 정렬해야하는 경우 가장 적합한 방법은 모든 유니 코드 텍스트에 대해 언어 독립적 인 데이터 정렬을 정의하는 Unicode Collation Algorithm입니다. 이 알고리즘은 사용자 정의 할 수 있지만 어느 한 문화권에는 의미있는 결과를 제공 할 필요는 없습니다.

Java의 데이터 정렬 클래스는이 알고리즘을 구현하지 않지만 ICU's RuleBaseCollator의 일부로 사용할 수 있습니다.

+1

자바에서는 로케일 ("")을 사용하여 루트 로켈을 얻습니다 (Java 7에서는 Locale.ROOT 상수가 있음). 이 로케일에 대한 Collator는 UCA입니다. –

관련 문제