ä;Java中的字母排序问题

ä;Java中的字母排序问题,java,sorting,unicode,localization,Java,Sorting,Unicode,Localization,嗨,我有一些代码: 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); Collator

嗨,我有一些代码:

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);
Collator col=Collator.getInstance(Locale.derman);
ListList=newarraylist();
列表。添加(“ac”);
列表。添加(“äb”);
列表。添加(“aa”);
列表。添加(“bb”);
集合。排序(列表、列);
系统输出打印项次(列表);
我希望得到[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);
字符串规则=
(List=newarraylist();
列表。添加(“ac”);
列表。添加(“äb”);
列表。添加(“aa”);
列表。添加(“bb”);
集合。排序(列表、列);
系统输出打印项次(列表);

00E4是ä的UTF-8代码,所以据我所知,它应该可以正常工作?或者我做错了什么。。。提前感谢您的帮助。

您得到的顺序是正确的,至少根据此主题的规则是正确的(对不起,德语可能会帮助您,尽管它会破坏我的umlauts…)

如果您希望您的重音字符始终位于正常字符之后,您可以在为该主题定义的规则中预先添加一个
@

规则元素的定义如下:

[……]

修饰符:当前有两个修饰符启用特殊排序规则

@”:打开重音的向后排序(次要差异),如法语

':打开泰语/老挝语元音辅音交换。如果当范围为\U0E40-\U0E44的泰语元音先于范围为\U0E01-\U0E2E的泰语辅音或范围为\U0EC0-\U0EC4的老挝元音先于范围为\U0E81-\U0EAE的老挝辅音时,此规则有效,则该元音将置于辅音之后,以便于核对

[……]

因此,您的示例代码如下所示:

(我只对
ä
字符进行了更改,即
@\u00e4、@\u00c4


我怀疑在德国的语言环境中,它不把乌姆劳特算作制造另一个角色。尝试使用英语/美国语言——尽管我也不确定unicode装饰将如何使用。为什么您希望按这种顺序进行排序?是否应在
af
之前或之后对
进行排序?您需要了解unicode排序规则是如何工作的。默认排序不会考虑第一个比较级别的符号,因为“AB”和“AB”和“SUB”都将位于“AC”之前。此外,德语电话簿区域设置(您使用的不是该区域设置!)将“äb”视为等同于“aeb”。根据德国的规则,您有时需要这样做。而且,如果您的源代码本身是UTF-8格式的,那么阅读起来就容易多了!你是对的。排序顺序正确<代码>ä
的排序与
ae
类似,但不应该将
äb
aeb
)排在
ac
之后?好吧,根据维基百科,标准DIN 5007中有两个变体:第一个(用于单词)将ä和a视为相同,第二个(用于姓名)将ä和ae视为相同。Java似乎实现了第一个,我觉得这是明智的。
 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]