2011-10-24 35 views
11

Comment l'ordre lexicographique est-il défini en Java en particulier en référence aux caractères spéciaux comme !, . et ainsi de suite?Ordre lexicographique en Java

Un ordre se trouve exemplaire here

Mais comment Java la définition de sa commande? Je demande parce que je suis en train de trier les chaînes sur Java et Oracle et de trouver des résultats différents et ne trouve pas la spécification pour l'ordre lexicographique.

+0

Si vous avez besoin de changer l'ordre des langues naturelles ou pour correspondre à la commande d'Oracle voir java.text.Collator. – EJP

Répondre

24

De la documentation pour String.compareTo:

Compare deux chaînes lexicographique. La comparaison est basée sur la valeur Unicode de chaque caractère dans les chaînes.

et

Telle est la définition de l'ordre lexicographique. Si deux chaînes sont différentes, alors elles ont des caractères différents à un index qui est un index valide pour les deux 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; alors la chaîne dont le caractère à la position k a la plus petite valeur, 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 des deux valeurs de caractère à la position k dans la chaîne [...]

Donc, fondamentalement, il traite chaque chaîne comme une séquence d'entiers non signés de 16 bits. Aucune conscience culturelle, aucune compréhension des caractères composites, etc. Si vous voulez un type plus complexe de sorte, vous devriez regarder Collator.

2

du javadocs:

La comparaison est basée sur la valeur Unicode de chaque caractère dans les cordes.

plus détaillée:

Telle est la définition de l'ordre lexicographique. Si deux chaînes sont différentes, alors soit elles ont des caractères différents à un index qui est un index valide pour les deux chaînes , soit 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; alors la chaîne dont le caractère à la position k a la plus petite valeur, comme déterminé en utilisant l'opérateur <, précède lexicographiquement l'autre chaîne. Dans ce cas, compareTo retourne la différence des deux valeurs de caractères à la position k dans les deux cordes ...

7

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 dans votre base de données. Vous voulez que ce soit 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 différent de comparaison en fonction du jeu de caractères de votre base de données Oracle utilise.

+2

Bien que ce commentaire m'a aidé le plus, j'ai marqué la réponse de @jonskeet comme correcte à cause du libellé de la question. Il s'avère que la base de données utilise le codage 'alutf8' (par défaut) et non' utf8'. À des fins de test, j'ai mis en place une base de données en utilisant 'utf8' et tout a été trié comme prévu. commandes «alutf8» "." après les caractères (c'était un "M" pour moi) en utilisant "utf8" a abouti à "." commandé avant "M". Très ennuyant. – oschrenk

0

Espérons que cela aide !! Employé trié en fonction de l'ordre décroissant de la note et si deux employés différents ont le même score, nous devons considérer le nom de l'employé pour le tri lexicographique.

employés implémentation de la classe: (Utilisé interface Comparable pour 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; 
}