Лексикографический заказ на 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;
}