2011-01-11 7 views
8

Hallo habe einige Stück Code:ä Briefsortier- Problem in 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); 

Ich würde erwarten, bekommen [aa, ac, ab, bb] ausgegeben, stattdessen erhalte ich: [AA, AB, ac, bb]

Ich habe keine Ahnung, was ich falsch mache ... danke im Voraus für Hilfe.


Hallo vielen Dank für die Antworten.

Leider Anforderungen des Projekts klar sagen, dass Strings in einer solchen Reihenfolge sortiert werden müssen: [aa, ac, ab, bb]: so habe ich versucht, diesen Code zu verwenden:

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 ist UTF- 8 Code für ä so wie ich es verstehe, sollte es funktionieren? Oder ich mache etwas falsches ... danke im Voraus für Hilfe.

+1

Ich vermute, in das deutsche Gebietsschema zählt Umlaute nicht als Making-and-Character. Versuchen Sie es in Englisch/US - obwohl ich mir nicht sicher bin, wie das mit den Unicode-Dekorationen funktionieren wird. –

+0

Warum sollten Sie es in dieser Reihenfolge erwarten? –

+0

sollte 'äb' vor' af' oder nachher sortiert werden? – Philipp

Antwort

8

Die Reihenfolge erhalten Sie richtig ist, zumindest nach dem Wikipedia entry für dieses Thema (sorry in Deutsch, Google Translate Sie helfen könnten, obwohl sie die Umlaute für mich korrumpiert ...)

+0

Sie haben Recht. Die Sortierreihenfolge ** ist ** korrekt. 'ä' ist wie' ae' sortiert –

+1

Aber sollte 'äb' (' aeb') nicht nach 'ac' kommen? –

+6

Nun, laut Wikipedia gibt es in der Norm DIN 5007 zwei Varianten: Die erste (für Wörter) behandelt ä und a als dieselbe, die zweite (für Namen) behandelt ä und ae wie die gleich. Java scheint die erste zu implementieren, die ich für sinnvoll halte. –

2

Wenn Sie Ihre akzentuierte wollen Zeichen, um immer nach den normalen zu kommen, können Sie eine @ in Ihrer definierten Regel für die RuleBasedCollator voranstellen.

Die Definitionen der Regelelemente ist wie folgt:

[...]

Modifier: Es gibt derzeit zwei Modifikatoren, die auf speziellen Sortierregeln drehen.

'@': Schaltet die Sortierung der Akzente (sekundäre Unterschiede) rückwärts ein, wie in Französisch.

'! ': Aktiviert den Thai/Lao-Vokal-Konsonantenwechsel. Wenn diese Regel in Kraft ist, wenn ein thailändischer Vokal des Bereichs \ U0E40- \ U0E44 einem thailändischen Konsonanten des Bereichs \ U0E01- \ U0E2E vorangeht ODER einem Lao-Vokal des Bereichs \ U0EC0- \ U0EC4 ein Lao-Konsonant des Bereichs vorausgeht \ U0E81- \ U0EAE dann wird der Vokal nach dem Konsonanten zu Vergleichszwecken platziert.

[...]

Also Ihr Codebeispiel aussehen würde wie folgt:

(I die Änderung vorgenommen hat nur für den ä Charakter, dh @\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); 

Die Ausgabe ist:

[aa, ac, af, äb, bb]