Comment l’ordre lexicographique est-il défini en Java, en particulier en référence à des caractères spéciaux tels que !
, .
et ainsi de suite?
Vous trouverez un exemple de commande ici
Mais comment Java définit-il son ordre? Je pose la question parce que je trie des chaînes sur Java et sur Oracle et que j'obtiens des résultats différents sans pouvoir trouver la spécification de l'ordre lexicographique.
À partir de la documentation pour String.compareTo
:
Compare deux chaînes lexicographiquement. La comparaison est basée sur la valeur Unicode de chaque caractère dans les chaînes.
et
Telle est la définition de la commande lexicographique. Si deux chaînes sont différentes, elles ont des caractères différents à un index qui est un index valide pour les deux chaînes ou leur longueur est différente, ou les deux. S'ils ont des caractères différents à une ou plusieurs positions d'index, soit k le plus petit de ces index; puis la chaîne dont le caractère à la position k a la valeur la plus petite, déterminée à l'aide de l'opérateur <, précède lexicographiquement l'autre chaîne. Dans ce cas, compareTo renvoie la différence entre les deux valeurs de caractère à la position k dans la chaîne [...]
Donc, fondamentalement, chaque chaîne est traitée comme une séquence d’entiers non signés 16 bits. Pas de conscience culturelle, pas de compréhension des personnages composites, etc. Si vous voulez un genre plus complexe, vous devriez regarder Collator
.
En Java, il est basé sur la valeur Unicode de la chaîne:
http://download.Oracle.com/javase/1.4.2/docs/api/Java/lang/String.html#compareTo(Java.lang.String )
Dans Oracle, cela dépend du jeu de caractères que vous utilisez sur votre base de données. Vous voudrez que ce soit en UTF-8 pour avoir un comportement cohérent avec Java.
Pour vérifier le jeu de caractères:
SQL> SELECT parameter, value FROM nls_database_parameters
WHERE parameter = 'NLS_CHARACTERSET';
PARAMETER VALUE
------------------ ---------------------
NLS_CHARACTERSET UTF8
Si ce n'est pas UTF-8, vous pouvez obtenir un comportement de comparaison différent selon le jeu de caractères utilisé par votre base de données Oracle.
depuis le javadocs :
La comparaison est basée sur la valeur Unicode de chaque caractère dans les chaînes.
plus détaillé:
Telle est la définition de la commande lexicographique. Si deux chaînes sont différent, alors soit ils ont des caractères différents à un index qui est un index valide pour les deux les chaînes, ou leurs longueurs sont différentes, ou les deux. S'ils ont des caractères différents à une ou plusieurs positions d'index, soit k le plus petit de ces indices; puis la chaîne dont le caractère à la position k a la valeur la plus petite, déterminée à l'aide de l'opérateur <, lexicographiquement précède l’autre chaîne. Dans ce cas, compareTo retourne le différence entre les deux valeurs de caractère à la position k dans la chaîne ...
J'espère que cela t'aides!!
Les employés triés en fonction de l'ordre décroissant du score et si deux employés différents ont le même score, nous devons alors considérer Nom de l'employé pour le tri lexicographique.
Mise en œuvre de la classe d'employés: (Interface comparable utilisée dans ce cas.)
@Override
public int compareTo(Object obj) {
Employee emp = (Employee) obj;
if(emp.getScore() > this.score) return 1;
else if(emp.getScore() < this.score) return -1;
else
return emp.getEmpName().compareToIgnoreCase(this.empName) * -1;
}