Лексикографический порядок в Java

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

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

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


person oschrenk    schedule 24.10.2011    source источник
comment
Если вам нужно изменить порядок для естественных языков или привести его в соответствие с порядком Oracle, см. java.text.Collator.   -  person user207421    schedule 25.10.2011


Ответы (4)


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

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

а также

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

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

person Jon Skeet    schedule 24.10.2011

В 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.

person Community    schedule 24.10.2011
comment
Хотя этот комментарий помог мне больше всего, я отметил ответ @jonskeet как правильный из-за формулировки вопроса. Оказывается, база данных использовала кодировку alutf8 (по умолчанию), а не utf8. В целях тестирования я настроил базу данных, используя utf8, и все было отсортировано, как и ожидалось. alutf8 заказы . после символов (для меня это была буква М) при использовании utf8 приводило к . заказал перед М. Очень раздражает. - person oschrenk; 24.10.2011


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

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

Реализация класса сотрудников: (в этом случае используется интерфейс 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;
}
person Nivas C.T.    schedule 21.08.2016