我想打印所有可用语言的分类波兰语名称。
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
不幸的是,波兰语ł
出现在l
之后和m
之前,因此输出应为:
:
:
kataloński
koreański
litewski
łotewski
macedoński
:
:
węgierski
włoski
我怎样才能做到这一点?是否存在一种通用的非语言相关方法(假设我现在想要显示它并使用另一种排序规则在另一种语言中排序)。
答案 0 :(得分:7)
尝试
Collections.sort(langs, Collator.getInstance(new Locale("pl", "PL")));
它会产生
...
litewski
łotewski
...
请参阅Collator API了解详情
答案 1 :(得分:4)
您应该将Collator传递给sort方法:
// sort according to default locale
Collections.sort(langs, Collator.getInstance());
默认排序顺序由字符串中的Unicode代码点定义,并且不是任何语言的正确字母顺序。
答案 2 :(得分:2)
看看java.text.Collator.newInstance(Locale)
。您需要在您的情况下提供波兰语语言环境。 Collators实现Comparator
接口,因此您可以在排序API和排序数据结构(如TreeSet
)中使用它。
答案 3 :(得分:1)
答案 4 :(得分: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;
}
}
答案 5 :(得分:0)
类似这样的东西
val polishCollator = yourCollection.sortedWith(Comparator { s1, s2 ->
Collator.getInstance(Locale("pl", "PL")).compare(s1,s2)
})