【发布时间】:2011-11-22 02:11:22
【问题描述】:
我目前正在处理匈牙利语的一些数据。 我必须对匈牙利字符串列表进行排序。
根据this Collation Sequence page
匈牙利字母顺序为:A=Á, B, C, CS, D, DZ, DZS, E=É, F, G, GY、H、I=Í、J、K、L、LY、M、N、NY、O=Ó、Ö=Ő、P、Q、R、S、SZ、T、TY、 U=Ú, Ü=Ű, V, W, X, Y, Z, ZS
因此元音被视为相同 (A=Á, ...),因此您可以使用 Collator 获得类似的结果:
Abdffg
Ádsdfgsd
Aegfghhrf
到这里,没问题:)
但是现在,我有要求按照Hungarian alphabet排序
A Á B C Cs D Dz Dzs E É F G Gy H I Í J K L Ly M N Ny O Ó Ö Ő P (Q) R S Sz T Ty U Ú Ü Ű V (W) (X) (Y) Z Zs
A 被认为与 Á 不同
使用来自Collator 的Strength 不会改变输出中的顺序。 A 和 Á 还是混在一起了。
是否有任何库/技巧可以根据匈牙利字母顺序对字符串列表进行排序?
到目前为止,我正在做的是:
- 使用
Collator排序,以便正确排序 C/C、D、DZ、DZS... - 通过基于地图比较每个单词的第一个字符再次排序
这任务看起来太麻烦了吧?
List<String> words = Arrays.asList(
"Árfolyam", "Az",
"Állásajánlatok","Adminisztráció",
"Zsfgsdgsdfg", "Qdfasfas"
);
final Map<String, Integer> map = new HashMap<String, Integer>();
map.put("A",0);
map.put("Á",1);
map.put("E",2);
map.put("É",3);
map.put("O",4);
map.put("Ó",5);
map.put("Ö",6);
map.put("Ő",7);
map.put("U",8);
map.put("Ú",9);
map.put("Ü",10);
map.put("Ű",11);
final Collator c = Collator.getInstance(new Locale("hu"));
c.setStrength(Collator.TERTIARY);
Collections.sort(words, c);
Collections.sort(words, new Comparator<String>(){
public int compare(String s1, String s2) {
int f = c.compare(s1,s2);
if (f == 0) return 0;
String a = Character.toString(s1.charAt(0));
String b = Character.toString(s2.charAt(0));
if (map.get(a) != null && map.get(b) != null) {
if (map.get(a) < map.get(b)) {
return -1;
}
else if (map.get(a) == map.get(b)) {
return 0;
}
else {
return 1;
}
}
return 0;
}
});
感谢您的意见
【问题讨论】:
-
我知道您不是在寻找“相同”的比较强度 (Collator.IDENTICAL),对吧?在那种情况下,我猜 A 和 Á 会有所不同......
-
将强度更改为 IDENTICAL 仍然像 A 和 Á 一样对列表进行排序。
-
在 java 6 中,当我调用
Collections.sort(words)时,它会根据您的需要使用A然后Á... -
@maerics。如果你添加一个以'Z'开头的单词,顺序是A->Z->Á,我希望它是A->Á->Z。对不起,我会在示例中添加更多单词
-
我可能会非常非常迟到,但我觉得有必要指出匈牙利的字母顺序比这要复杂得多。例如,此页面上的答案均不处理双有向字母(“ccs”被处理为“cs”+“cs”)。 Here is 规则的简短摘要。甚至该摘要也被简化了,因为您需要一个词汇表来正确排序匈牙利语单词,因为在某些特殊情况下,排序取决于单词的含义。
标签: java collation comparator