你有一些代码:
Collator col = Collator.getInstance(Locale.GERMAN);
List< String> list = new ArrayList<String>();
list.add("ac");
list.add("äb");
list.add("aa");
list.add("bb");
Collections.sort(list,col);
System.out.println(list);
我希望得到[aa,ac,äb,bb]输出,而不是我得到: [aa,äb,ac,bb]
我不知道我做错了什么......先谢谢你的帮助。
嗨,谢谢大家的回答。
不幸的是,项目的要求清楚地说明字符串必须按照这样的顺序排序: [aa,ac,äb,bb]:所以我试着使用这段代码:
String europeanRules =
("< a,A ; \u00e0,\u00c0 ; \u00e1,\u00c1 ; \u00e2,\u00c2 ; \u00e3,\u00c3; \u00e4,\u00c4 ; \u00e5,\u00c5 ; \u00e6,\u00c6 "+
"; \u0101,\u0100 ; \u0103,\u0102 ; \u0105,\u0104 " +
"< b,B < c,C ; \u00e7,\u00c7 ; \u0107,\u0106 ; \u0109,\u0108 ; \u010b,\u010a ; \u010d,\u010c " +
"< d,D ; \u010f,\u010e ; \u0111,\u0110 " +
"< e,E ; \u00e8,\u00c8 ; \u00e9,\u00c9 ; \u00ea,\u00ca ; \u00eb,\u00cb " +
"; \u0113,\u0112 ; \u0115,\u0114 ; \u0116,\u0117 ; \u0119,\u0118 ; \u011b,\u011a " +
"< f,F < g,G < h,H " +
"< i,I ; \u00ec,\u00cc ; \u00ed,\u00cd ; \u00ee,\u00ce ; \u00ef,\u00cf " +
"< j,J < k,K " +
"< l,L ; \u013a,\u0139 ; \u013c,\u013b ; \u013e,\u013d ; \u0140,\u013f ; \u0142,\u0141 " +
"< m,M < n,N ; \u00f1,\u00d1 ; \u0144,\u0143 ; \u0146,\u0145 ; \u0148,\u0147 " +
"< o,O ; \u00f2,\u00d2 ; \u00f3,\u00d3 ; \u00f4,\u00d4 ; \u00f5,\u00d5 ; \u00f6,\u00d6 ; \u00f8,\u00d8 " +
"; \u014d,\u014c ; \u014f,\u014e ; \u0151,\u0150 " +
"< p,P < q,Q < r,R ; \u0155,\u0154 ; \u0157,\u0156 ; \u0159,\u0158 " +
"< s,S ; \u015b,\u015a ; \u015d,\u015c ; \u015f,\u015e ; \u0161,\u0160 " +
"< t,T ; \u0163,\u0162 ; \u0165,\u0164 ; \u0167,\u0166 " +
"< u,U ; \u00f9,\u00d9 ; \u00fa,\u00da ; \u00fb,\u00db ; \u00fc,\u00dc ; \u0169,\u0168 ; \u016b,\u016a ; \u016d,\u016c " +
"; \u016f,\u016e ; \u0171,\u0170 ; \u0173,\u0172 " +
"< v,V < w,W ; \u0175,\u0174 " +
"< x,X < y,Y ; \u00fd,\u00dd ; \u00ff ; \u0177,\u0176 ; \u0178 " +
"< z,Z ; \u017a,\u0179 ; \u017c,\u017b ; \u017e,\u017d");
RuleBasedCollator col = null;
try {
col = new RuleBasedCollator(europeanRules);
} catch (ParseException e) {
}
col.setStrength(Collator.SECONDARY);
col.setDecomposition(Collator.FULL_DECOMPOSITION);
List< String> list = new ArrayList<String>();
list.add("ac");
list.add("äb");
list.add("aa");
list.add("bb");
Collections.sort(list,col);
System.out.println(list);
00E4是ä的UTF-8代码,据我所知它应该可以正常工作?或者我做错了什么......先谢谢你的帮助。
答案 0 :(得分:8)
你得到的顺序是正确的,至少根据这个主题的Wikipedia entry(对不起德语,Google Translate可能对你有所帮助,虽然它会破坏我的变音符号......)
答案 1 :(得分:2)
如果您希望重音字符始终位于正常字符之后,则可以在RuleBasedCollator的已定义规则中添加@
。
规则要素的定义如下:
[...]
修饰符:目前有两个修饰符可以启用特殊的排序规则。
' @ ':打开重音符号的后向排序(次要差异),如法语。
'!':打开泰语/老挝元音 - 辅音交换。如果此规则在范围\ U0E40- \ U0E44的泰语元音位于范围\ U0E01- \ U0E2E的泰语辅音之前有效,或者范围为\ U0EC0- \ U0EC4的老挝元音先于该范围的老挝辅音\ U0E81- \ U0EAE然后将元音放在辅音后面以进行整理。
[...]
所以你的示例代码如下所示:
(我仅针对ä
字符进行了更改,即@\u00e4, @\u00c4
)
String europeanRules =
("< a,A ; \u00e0,\u00c0 ; \u00e1,\u00c1 ; \u00e2,\u00c2 ; \u00e3,\u00c3; @\u00e4,@\u00c4 ; \u00e5,\u00c5 ; \u00e6,\u00c6 "+
"; \u0101,\u0100 ; \u0103,\u0102 ; \u0105,\u0104 " +
"< b,B < c,C ; \u00e7,\u00c7 ; \u0107,\u0106 ; \u0109,\u0108 ; \u010b,\u010a ; \u010d,\u010c " +
"< d,D ; \u010f,\u010e ; \u0111,\u0110 " +
"< e,E ; \u00e8,\u00c8 ; \u00e9,\u00c9 ; \u00ea,\u00ca ; \u00eb,\u00cb " +
"; \u0113,\u0112 ; \u0115,\u0114 ; \u0116,\u0117 ; \u0119,\u0118 ; \u011b,\u011a " +
"< f,F < g,G < h,H " +
"< i,I ; \u00ec,\u00cc ; \u00ed,\u00cd ; \u00ee,\u00ce ; \u00ef,\u00cf " +
"< j,J < k,K " +
"< l,L ; \u013a,\u0139 ; \u013c,\u013b ; \u013e,\u013d ; \u0140,\u013f ; \u0142,\u0141 " +
"< m,M < n,N ; \u00f1,\u00d1 ; \u0144,\u0143 ; \u0146,\u0145 ; \u0148,\u0147 " +
"< o,O ; \u00f2,\u00d2 ; \u00f3,\u00d3 ; \u00f4,\u00d4 ; \u00f5,\u00d5 ; \u00f6,\u00d6 ; \u00f8,\u00d8 " +
"; \u014d,\u014c ; \u014f,\u014e ; \u0151,\u0150 " +
"< p,P < q,Q < r,R ; \u0155,\u0154 ; \u0157,\u0156 ; \u0159,\u0158 " +
"< s,S ; \u015b,\u015a ; \u015d,\u015c ; \u015f,\u015e ; \u0161,\u0160 " +
"< t,T ; \u0163,\u0162 ; \u0165,\u0164 ; \u0167,\u0166 " +
"< u,U ; \u00f9,\u00d9 ; \u00fa,\u00da ; \u00fb,\u00db ; \u00fc,\u00dc ; \u0169,\u0168 ; \u016b,\u016a ; \u016d,\u016c " +
"; \u016f,\u016e ; \u0171,\u0170 ; \u0173,\u0172 " +
"< v,V < w,W ; \u0175,\u0174 " +
"< x,X < y,Y ; \u00fd,\u00dd ; \u00ff ; \u0177,\u0176 ; \u0178 " +
"< z,Z ; \u017a,\u0179 ; \u017c,\u017b ; \u017e,\u017d");
RuleBasedCollator col = null;
try {
col = new RuleBasedCollator(europeanRules);
} catch (ParseException e) {
}
col.setStrength(Collator.SECONDARY);
col.setDecomposition(Collator.FULL_DECOMPOSITION);
List< String> list = new ArrayList<String>();
list.add("ac");
list.add("äb");
list.add("aa");
list.add("af");
list.add("bb");
Collections.sort(list,col);
System.out.println(list);
输出结果为:
[aa, ac, af, äb, bb]