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

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

import java.util.*; public class Tmp { public static void main(String... args) { Locale.setDefault(new Locale("pl","PL")); Locale[] locales = Locale.getAvailableLocales(); ArrayList langs = new ArrayList(); 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 

不幸的是,在波兰语中,在l之后和m之前,所以输出应该是:

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

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

您应该将Collat​​or传递给sort方法:

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

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

尝试

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

它会产生

 ... litewski łotewski ... 

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

看看java.text.Collator.newInstance(Locale) 。 在您的情况下,您需要提供波兰语语言环境。 Collat​​ors实现了Comparator接口,因此您可以在排序API和排序数据结构(如TreeSet

不幸的是,在波兰语中,在l之后和m之前,所以输出应该是:

您可以定义自己的CompararableComparator界面。

或者这可能对您有所帮助:

  • 使用本地化排序字符串列表

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

 public class SortBasedOnName implements Comparator { private Map myCharMap; private final static MapmyPolCharTable = new HashMap(); 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  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; } }