使用非西方字符对字符串进行排序

Paw*_* P. 7 java sorting string locale

我想打印所有可用语言的分类波兰语名称.

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);
    }
  }
}
Run Code Online (Sandbox Code Playgroud)

不幸的是我对排序部分有疑问.输出是:

:
:
katalo?ski
korea?ski
litewski
macedo?ski
:
:
w?gierski
w?oski
?otewski
Run Code Online (Sandbox Code Playgroud)

不幸的是在波兰?之后来到l之前m所以输出应该是:

:
:
katalo?ski
korea?ski
litewski
?otewski
macedo?ski
:
:
w?gierski
w?oski
Run Code Online (Sandbox Code Playgroud)

我怎么能做到这一点?是否存在一种通用的非语言相关方法(比如说我现在想要显示它并使用另一种排序规则在另一种语言中排序).

Evg*_*eev 9

尝试

Collections.sort(langs, Collator.getInstance(new Locale("pl", "PL")));
Run Code Online (Sandbox Code Playgroud)

它会产生

...
litewski
?otewski
...
Run Code Online (Sandbox Code Playgroud)

有关详细信息,请参阅Collat​​or API


Jon*_*oni 5

您应该将整理器传递给sort方法:

// sort according to default locale
Collections.sort(langs, Collator.getInstance());
Run Code Online (Sandbox Code Playgroud)

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