ä problème de tri des lettres en Java
Salut ont un morceau de code:
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);
Je m'attendrais à obtenir la sortie [aa, ac, äb, bb], à la place je reçois : [aa, äb, ca, bb]
Je n'ai aucune idée de ce que je fais mal ... merci d'avance pour l'aide.
Salut merci à tous pour les réponses.
Malheureusement, les exigences du projet indiquent clairement que les chaînes doivent être triées dans cet ordre : [aa, ac, äb, bb] : j'ai donc essayé d'utiliser ce code :
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 est un code UTF-8 pour ä si je comprends bien devrait fonctionner correctement ? Ou je fais quelque chose de mal ... merci d'avance pour l'aide.
2 answers
L'ordre que vous obtenez est correct, au moins selon l'entrée Wikipediapour ce sujet (désolé en allemand, Google Translate pourrait vous aider, bien que cela corrompe les umlauts pour moi...)
Si vous voulez que vos caractères accentués viennent toujours après les caractères normaux, vous pouvez ajouter un @
dans votre règle définie pour le RuleBasedCollator.
Les définitions des éléments de règle sont les suivantes:
[...]
Modificateur : Il existe actuellement deux modificateurs qui activent des règles de classement spéciales.
'@' : Active le tri à l'envers des accents (différences secondaires), comme en français.
'!': Active l'échange voyelle-consonne thaï/lao. Si cette règle est en vigueur lorsqu'une voyelle thaïlandaise de la plage \U0E40-\U0E44 précède une consonne thaïlandaise de la plage \U0E01-\U0E2E OU une voyelle laotienne de la plage \U0EC0-\U0EC4 précède une consonne laotienne de la plage \U0E81-\U0EAE, la voyelle est placée après la consonne à des fins de classement.
[...]
Donc votre exemple de code ressemblerait à ce qui suit:
(j'ai fait le changement uniquement pour les ä
caractère, c'est à dire @\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);
La sortie est:
[aa, ac, af, äb, bb]