2011-01-11 65 views
8

嗨排序問題有一定的一段代碼:一個字母在Java中

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,AB,BB]輸出,而不是我得到: [AA,AB,交流,bb]

我不知道我在做什麼錯了......先謝謝你的幫助。


嗨,感謝所有的答案。

不幸的是,項目的要求說清楚,字符串必須在這樣的順序進行排序: [AA,AC,AB,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代碼爲ä,據我瞭解它應該工作正常嗎?或者我做錯了什麼......先謝謝你的幫助。

+1

我懷疑在德語的語言環境,它不會把變音記爲另一個字符。嘗試英文/美國 - 雖然我不確定這將如何與unicode裝飾工作。 – 2011-01-11 22:22:20

+0

爲什麼你會按照這個順序呢? – 2011-01-11 22:57:06

回答

8

你得到的順序是正確的,至少根據Wikipedia entry對於這個問題如果你希望你的重音(德文對不起,Google Translate可以幫助你,但它破壞了變音對我來說...)

2

字符總是在正常的後面出現,您可以在RuleBasedCollator的定義規則中添加@

規則元素的定義如下:

[...]

修改:當前有打開的特殊整理規則,兩個修飾。

'@':打開向後排列的重音(二次差異),如法語。

'':打開泰語/老撾元音 - 輔音交換。如果該規則有效時,範圍的泰語元音在範圍\ 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] 
相關問題