2013-03-20 36 views
5

我想打印所有可用语言的排序波兰语名称。使用非西方字符排序字符串

import java.util.*; 

public class Tmp 
{ 
    public static void main(String... args) 
    { 
    Locale.setDefault(new Locale("pl","PL")); 
    Locale[] locales = Locale.getAvailableLocales(); 
    ArrayList<String> langs = new ArrayList<String>(); 
    for(Locale loc: locales) { 
     String lng = loc.getDisplayLanguage(); 
     if(!lng.trim().equals("") && ! langs.contains(lng)){ 
     langs.add(lng); 
     } 
    } 
    Collections.sort(langs); 
    for(String str: langs){ 
     System.out.println(str); 
    } 
    } 
} 

不幸的是,我有分拣部分的问题。 输出是:

: 
: 
kataloński 
koreański 
litewski 
macedoński 
: 
: 
węgierski 
włoski 
łotewski 

不幸的是在波兰łlm之前,所以输出应该是:

: 
: 
kataloński 
koreański 
litewski 
łotewski 
macedoński 
: 
: 
węgierski 
włoski 

我怎样才能做到呢?有没有一种通用的非语言依赖方法(例如,我现在想要显示这个并用另一种排序规则排序为另一种语言)。

+1

你有没有检查过这个解决方案? http://stackoverflow.com/questions/12889760/sort-list-of-strings-with-localization – Abdul 2013-03-20 08:29:03

回答

4

你应该通过一个分页器的一种排序方法:

// sort according to default locale 
Collections.sort(langs, Collator.getInstance()); 

默认的排序顺序是由字符串中的Unicode代码点定义,这是不以任何语言的正确字母顺序排列。

2

看一看java.text.Collator.newInstance(Locale)。您需要提供波兰语区域设置。校准器实现Comparator接口,因此您可以在排序API和排序数据结构(如TreeSet)中使用该接口。

6

尝试

Collections.sort(langs, Collator.getInstance(new Locale("pl", "PL"))); 

会产生

... 
litewski 
łotewski 
... 

看到山口lator API的详细信息

0

我正在处理相同的问题。我发现本地收集器解决方案适用于Android 7.0,但不适用于早期的Android版本。 我已经实现了以下算法。它非常快(我排序超过3000个字符串),并在早期的Android版本上完成。

public class SortBasedOnName implements Comparator { 

    private Map<Character, Integer> myCharMap; 
    private final static Map<Character, Integer>myPolCharTable = new HashMap<Character, Integer>(); 
    static { 
     myPolCharTable.put(' ',0x0020); 
     myPolCharTable.put('!',0x0021); 
     myPolCharTable.put('"',0x0022); 


     myPolCharTable.put('a',0x0040); 
     myPolCharTable.put('ą',0x0041); 
     myPolCharTable.put('b',0x0042); 
     myPolCharTable.put('c',0x0043); 
     myPolCharTable.put('ć',0x0044); 


     myPolCharTable.put('{',0x0066); 
     myPolCharTable.put('|',0x0067); 
     myPolCharTable.put('}',0x0068); 
    } 

    public SortBasedOnName() {} 

    public int compare(Object o1, Object o2) { 

     Dictionary dd1 = (Dictionary) o1; 
     Dictionary dd2 = (Dictionary) o2; 

    return strCompareWithDiacritics(dd1.getOriginal(), dd2.getOriginal()); 
    } 

    private int strCompareWithDiacritics(String s1, String s2) { 

     int i = 0; 
     int result = 0; 
     int length =0; 

     s1 = s1.toLowerCase(); 
     s2 = s2.toLowerCase(); 
     if (s1.length() > s2.length()) { 
      result = 1; 
      length = s2.length(); 
     } else if (s1.length() < s2.length()) { 
      result = -1; 
      length = s1.length(); 
     } else if (s1.length() == s2.length()) { 
      result = 0; 
      length = s1.length(); 
     } 

     try { 
      while (i <length) { 
       if (myPolCharTable.get(s1.charAt(i)) > myPolCharTable.get(s2.charAt(i))) { 
        result = 1; 
        break; 
       } else if (myPolCharTable.get(s1.charAt(i)) < myPolCharTable.get(s2.charAt(i))) { 
        result = -1; 
        break; 
       } 
       i++; 
      } 
     } catch (Exception e) { 
      e.printStackTrace(); 
     } 
     return result; 
    } 
}