Лексикографический заказ на Java

Как лексикографический порядок, определенный в Java, особенно применительно к специальным символам типа !, . и т.д.?

Примерный порядок можно найти здесь

Но как Java определяет его порядок? Я спрашиваю, потому что я сортирую строки на Java и Oracle и придумываю разные результаты и не могу найти спецификацию для лексикографического порядка.

Ответ 1

Из документов для String.compareTo:

Сравнивает две строки лексикографически. Сравнение основано на значении Unicode каждого символа в строках.

и

Это определение лексикографического упорядочения. Если две строки различны, то либо они имеют разные символы в каком-то индексе, который является допустимым индексом для обеих строк, либо их длина отличается, или и то, и другое. Если они имеют разные символы в одном или нескольких положениях индекса, пусть k - наименьший такой индекс; то строка, символ которой в положении k имеет меньшее значение, как определено с использованием < оператор, лексикографически предшествует другой строке. В этом случае compareTo возвращает разность двух символов в позиции k в двух строках [...]

В основном, он обрабатывает каждую строку, как последовательность из 16-разрядных целых чисел без знака. Нет понимания культуры, понимания сложных композиций и т.д. Если вы хотите более сложный вид, вы должны смотреть Collator.

Ответ 2

В Java он основан на значении Unicode строки:

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

В Oracle это будет зависеть от кодировки, которую вы используете в своей базе данных. Вы хотите, чтобы UTF-8 поддерживал согласованное поведение с Java.

Чтобы проверить набор символов:

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

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

Если это не UTF-8, вы можете получить другое поведение сравнения в зависимости от того, какой символ задает ваша база данных Oracle.

Ответ 3

из javadocs:

Сравнение основано на значении Unicode каждого символа в строках.

более подробно:

Это определение лексикографического упорядочения. Если две строки     разные, тогда     либо они имеют разные символы в каком-либо индексе, который является действительным индексом для обоих     строки или их длины различны или оба. Если у них разные символы     в одном или нескольких положениях индекса, пусть k - наименьший такой индекс; то строка, чья     символ в положении k имеет меньшее значение, как определено с использованием < оператор,     лексикографически предшествует другой строке. В этом случае compareTo возвращает     разность двух символов в позиции k в двух строках...

Ответ 4

Надеюсь, это поможет!

Сотрудник сортируется в соответствии с порядком уменьшения счета, и если у двух разных сотрудников одинаковый балл, тогда нам нужно рассмотреть имя сотрудника для сортировки лексикографически.

Реализация класса сотрудников: (Используется интерфейс Comparable для этого случая.)

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