2012-02-21 2 views
7

Android에서 국제 문자열을 올바르게 정렬하는 방법이 있습니까? 맞춤형 비교기와 compareTo() 메서드를 사용하지만 충분하지 않습니다. 이 "ö"와 같은 글자를 "o"근처에 표시하고 싶지만 모두 목록 끝에 있습니다. 비교기가 "o, a, ... 등"과 유사하다고 생각하도록하려면 어떻게해야합니까?Android는 특수 문자를 비교합니다

답변

15

로캘 인식 문자열 실행에를 사용합니다. 문서에서 :

로캘 구분 문자열 비교를 수행합니다. 구체 서브 클래스 인 RuleBasedCollator는 에 의한 정렬 순서 지정의 사용자 정의를 허용합니다. 비교 문자열

예 :

Collator deCollator = Collator.getInstance(Locale.GERMANY); // or new Locale("pl", "PL") for polish locale ;) 
System.out.println(deCollator.compare("abcö", "abco")); 

인쇄 1. 당신은 레이터 이상 사용 문자열 목록을 정렬하려면


, 당신은 쓸 수 있습니다 :

final List<String> strings = Arrays.asList(
     "über", "zahlen", "können", "kreativ", "Äther", "Österreich"); 
Collections.sort(strings, deCollator); // Collator implements Comparator 
System.out.println(strings); 

인쇄 :

[Äther, können, kreativ, Österreich, über, zahlen] 

편집 : 그냥 당신이 폴란드어 것을 발견 , 폴란드어 예 :

final List<String> strings = Arrays.asList(
     "pięć", "piec", "Pieczka", "pięść", "pieczęć", "pieczątka"); 
Collections.sort(strings, Collator.getInstance(new Locale("pl", "PL"))); 
System.out.println(strings); 
// output: [piec, pieczątka, pieczęć, Pieczka, pięć, pięść] 
+0

멋진 답변을 보내 주셔서 감사합니다. ;) 실제로, 나는 더 단순한 해결책을 발견했다 : Collator collator = Collator.getInstance(); collator.setDecomposition (Collator.CANONICAL_DECOMPOSITION); collator.compare (one, two)'두 번째 예제는 CANONICAL_DECOMPOSITION 룰이하는 일을 보여준다 : http://developer.android.com/reference/java/text/Collator.html – lomza

+1

'Collator.getInstance)'명시 적으로'Locale'이 없으면 환경 의존적이다 : ** 사용자의 디폴트 로케일 **에 적합한 Collator 인스턴스를 반환한다. "[기본 로케일을 경계하십시오] (http://developer.android.com/reference/java/util/Locale.html#default_locale)"._ – Xaerxess

+0

경고를 보내 주셔서 감사합니다. 그러나 나는 의심의 여지가 있습니다. 정렬 된 데이터는 사용자에게 표시 할 때만 필요하며 다른 곳으로 보내지 않거나 무언가를 계산하지 않아도됩니다 ... 기본 로케일로 충분할까요? 그러나 독일어와 덴마크 문자를 올바르게 분류하여 기계 출력으로 사용하려면 'Local.US' 로케일을 사용하는 것이 가장 좋습니다. – lomza

관련 문제