2011-10-24 65 views
11

¿Cómo se define el orden lexicográfico en Java, especialmente en referencia a los caracteres especiales como !, . y así sucesivamente?orden lexicográfico en Java

Una orden ejemplar se puede encontrar here

Pero, ¿cómo definir Java es el fin? Lo pregunto porque estoy ordenando cadenas en Java y en Oracle y obtengo resultados diferentes y no puedo encontrar la especificación para el orden lexicográfico.

+0

Si necesita cambiar el orden de las lenguas naturales o para que coincida con el pedido de Oracle ver java.text.Collator. – EJP

Respuesta

24

A partir de los documentos de String.compareTo:

Compara dos cadenas lexicográfico. La comparación se basa en el valor Unicode de cada carácter en las cadenas.

y

Esta es la definición de ordenamiento lexicográfico. Si dos cadenas son diferentes, entonces tienen caracteres diferentes en algún índice que es un índice válido para ambas cadenas, o sus longitudes son diferentes, o ambas. Si tienen caracteres diferentes en una o más posiciones de índice, sea k el índice más pequeño; entonces la cadena cuyo carácter en la posición k tiene el valor más pequeño, tal como se determina mediante el operador <, lexicográficamente precede a la otra cadena. En este caso, compareTo devuelve la diferencia de los dos valores de caracteres en la posición k en los dos cuerdas [...]

Así que, básicamente, se trata cada cadena como una secuencia de enteros sin signo de 16 bits. Sin el conocimiento cultural, ninguna comprensión de los caracteres compuestos, etc. Si quieres un tipo más complejo de la especie, se debe mirar Collator.

2

del javadocs:

La comparación se basa en el valor Unicode de cada personaje en las cuerdas.

más detallada:

Esta es la definición de ordenamiento lexicográfico. Si dos cadenas son diferente, ya sea tienen diferentes caracteres en algún índice que es un índice válido para ambas cadenas , o sus longitudes son diferentes, o ambas cosas. Si tienen caracteres diferentes en una o más posiciones de índice, sea k el índice más pequeño; entonces la cadena cuya carácter en la posición k tiene el valor más pequeño, tal como se determina mediante el operador <, precede lexicográficamente la otra cadena. En este caso, compareTo devuelve la diferencia de los dos valores de caracteres en la posición k en los dos cuerdas ...

7

En Java se basa en el valor Unicode de la cadena:

http://download.oracle.com/javase/1.4.2/docs/api/java/lang/String.html#compareTo(java.lang.String)

en Oracle, que dependerá del juego de caracteres que está utilizando en su base de datos. Querrá que sea UTF-8 para tener un comportamiento consistente con Java.

Para comprobar el juego de caracteres:

SQL> SELECT parameter, value FROM nls_database_parameters 
    WHERE parameter = 'NLS_CHARACTERSET'; 

PARAMETER    VALUE 
------------------ --------------------- 
NLS_CHARACTERSET  UTF8 

Si no es UTF-8, entonces se puede obtener diferentes comportamientos comparación dependiendo de qué juego de caracteres base de datos Oracle está utilizando.

+2

Aunque este comentario me ayudó más, marqué la respuesta de @jonskeet como correcta debido a la redacción de la pregunta. Resulta que la base de datos usó la codificación 'alutf8' (por defecto) y no' utf8'. Para propósitos de prueba, configuré una base de datos usando 'utf8' y todo fue ordenado como se esperaba. 'Alutf8' ordena". " después de los caracteres (era una "M" para mí) mientras usaba 'utf8' resultó en". " ordenado antes de "M". Muy molesto. – oschrenk

0

Espero que esto ayude !!

Empleado ordenado según el orden descendente del puntaje y si dos empleados diferentes tienen el mismo puntaje, entonces debemos considerar el nombre del empleado para clasificar lexicográficamente.

implementación de la clase Empleado: (interfaz comparable, utilizados para este caso.)

@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; 
} 
Cuestiones relacionadas