Java 中的字典顺序是如何定义的,尤其是在参考特殊字符时,比如!
,.
等等?
可以在此处找到示例订单
但是Java如何定义它的顺序呢?我问是因为我在 Java 和 Oracle 上对字符串进行排序并得出不同的结果,但找不到字典顺序的规范。
Java 中的字典顺序是如何定义的,尤其是在参考特殊字符时,比如!
,.
等等?
可以在此处找到示例订单
但是Java如何定义它的顺序呢?我问是因为我在 Java 和 Oracle 上对字符串进行排序并得出不同的结果,但找不到字典顺序的规范。
从文档中String.compareTo
:
按字典顺序比较两个字符串。比较基于字符串中每个字符的 Unicode 值。
和
这是字典顺序的定义。如果两个字符串不同,则它们在某个索引处具有不同的字符,该索引是两个字符串的有效索引,或者它们的长度不同,或两者兼而有之。如果它们在一个或多个索引位置具有不同的字符,则设 k 为此类索引中的最小;然后,在位置 k 处的字符具有较小值的字符串(通过使用 < 运算符确定)按字典顺序位于另一个字符串之前。在这种情况下, compareTo 返回两个字符串中位置 k 处的两个字符值的差 [...]
所以基本上,它将每个字符串视为 16 位无符号整数序列。没有文化意识,没有对复合字符等的理解。如果你想要更复杂的排序,你应该看看Collator
.
在 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 数据库使用的字符集获得不同的比较行为。
来自javadocs:
比较基于字符串中每个字符的 Unicode 值。
更详细:
这是字典顺序的定义。如果两个字符串不同,则它们在某个索引处具有不同的字符,该索引是两个字符串的有效索引,或者它们的长度不同,或两者兼而有之。如果它们在一个或多个索引位置具有不同的字符,则设 k 为此类索引中的最小;然后,在位置 k 处的字符具有较小值的字符串(通过使用 < 运算符确定)按字典顺序位于另一个字符串之前。在这种情况下, compareTo 返回两个字符串中位置 k 处的两个字符值的差...
希望这可以帮助!!
员工根据分数的降序排序,如果两个不同的员工得分相同,那么我们需要考虑员工姓名进行字典排序。
Employee 类实现:(在这种情况下使用 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;
}