2015-11-12 3 views
12

J'essaye de commander une liste de pays en chinois en utilisant Locale.SIMPLIFIED_CHINESE, qui semble commander en utilisant pinyin (alphabet phonétique, c'est-à-dire que les caractères sont classés en fonction de leur combinaison de caractères latins) , de A à Z).Mauvais tri avec Collator en utilisant Locale.SIMPLIFIED_CHINESE

Mais j'ai trouvé quelques cas quand il commande mal. Par exemple:

  • '中' caractère est zhong1
  • caractère '梵' est FAN4

devrait être 梵 < 中, mais il est commandé l'ordre correct dans l'autre sens.

String[] characters = new String[] {"梵", "中"}; 
List<String> list = Arrays.asList(characters); 
System.out.println("Before sorting..."); 
System.out.println(list.toString()); 

Collator collator = Collator.getInstance(Locale.SIMPLIFIED_CHINESE); 
collator.setStrength(Collator.PRIMARY); 
Collections.sort(list, collator); 

System.out.println("After sorting..."); 
System.out.println(list.toString()); 

Les résultats de cet extrait sont:

Before sorting... 
[梵, 中] 
After sorting... 
[中, 梵] 

En approfondissant, je trouve les règles que Java applique avec Locale.SIMPLIFIED_CHINESE. Vous pouvez trouver dans l'image suivante: http://postimg.org/image/4t915a7gp/full/ (Notez que 梵 est après 中)

j'ai réalisé avant la < 口 < 口 < 口 < 口 < 口 que je surlignés en rouge, tous les personnages sont classés en fonction de leur correspondant latin combinaison, de A à Z. Cependant, après le signe < 口 < 口 < 口 < 口 < 口, les caractères sont classés par la composition du caractère. Par exemple, si tous les personnages ont une même partie (généralement la partie gauche du personnage), ils sont alors regroupés, non pas selon la règle de A à Z.

En outre, tous les personnages après la < 口 口 < < 口 口 < < 口 sont moins courants caractères chinois. Donc, 梵 est un caractère moins commun que 中, donc il est mis après < 口 < 口 < 口 < 口 < 口.

Je me demande pourquoi cette décision, si elle est intentionnelle. Mais il en résulte des tris erronés. Je ne sais pas comment trouver une solution pour cela.

Merci beaucoup pour votre temps!

+0

Avez-vous essayé d'utiliser icu4j? – fge

+0

J'ai essayé pinyin4j, et leur commande est bonne. icu4j pas encore essayé. Mais ma question est de savoir pourquoi Oracle trier avec ces règles, c'est peut-être un bug à signaler, ou peut-être qu'il y a une autre façon d'utiliser l'API Java pour trier avec les conventions pinyin. Dans mon entreprise, il est difficile d'ajouter de nouvelles bibliothèques en raison de la fiabilité. Merci pour votre soutien! – elegarpes

Répondre

2

L'ordre de tri fourni par l'assembleur en Java est basé sur les traits nécessaires à l'écriture de ce caractère.

Voir ci-dessous petit extrait à démontrer. nombres de traits tirés de Wikitionary

// the unicode character and the number of strokes 
String[] characters = new String[]{ 
    "\u68B5 (11)", "\u4E2D (4)", 
    "\u5207 (4)", "\u5973 (3)", "\u898B (7)" 
}; 
List<String> list = Arrays.asList(characters); 
System.out.println("Before sorting..."); 
System.out.println(list.toString()); 

Collator collator = Collator.getInstance(Locale.TRADITIONAL_CHINESE); 
collator.setStrength(Collator.PRIMARY); 
System.out.println(); 
Collections.sort(list, collator); 

System.out.println("After sorting..."); 
System.out.println(list.toString()); 

sortie

Before sorting... 
[梵 (11), 中 (4), 切 (4), 女 (3), 見 (7)] 

After sorting... 
[女 (3), 中 (4), 切 (4), 見 (7), 梵 (11)] 

Il y a une demande d'amélioration JDK-6415666 pour mettre en œuvre l'ordre de tri selon l'ordre de classement Unicode. Mais suite aux informations sur le Java 8 supported locale, il n'est pas implémenté dans Java 8.

modifier L'ordre de tri en utilisant l'assembleuse de icu4j est

[梵 (11), 見 (7), 女 (3), 切 (4), 中 (4)] 

code ICU4J extrait

import com.ibm.icu.text.Collator; 
import com.ibm.icu.text.RuleBasedCollator 
... 
Locale locale = new Locale("zh", "", "PINYIN"); 
Collator collator = (RuleBasedCollator) Collator.getInstance(locale);