Лексикографический порядок на Яве - PullRequest
11 голосов
/ 24 октября 2011

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

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

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

Ответы [ 4 ]

24 голосов
/ 24 октября 2011

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

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

и

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

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

7 голосов
/ 24 октября 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.

2 голосов
/ 24 октября 2011

из javadocs :

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

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

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

0 голосов
/ 21 августа 2016

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

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

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

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