14

Java 中的字典顺序是如何定义的,尤其是在参考特殊字符时,比如!,.等等?

可以在此处找到示例订单

但是Java如何定义它的顺序呢?我问是因为我在 Java 和 Oracle 上对字符串进行排序并得出不同的结果,但找不到字典顺序的规范。

4

4 回答 4

28

从文档中String.compareTo

按字典顺序比较两个字符串。比较基于字符串中每个字符的 Unicode 值。

这是字典顺序的定义。如果两个字符串不同,则它们在某个索引处具有不同的字符,该索引是两个字符串的有效索引,或者它们的长度不同,或两者兼而有之。如果它们在一个或多个索引位置具有不同的字符,则设 k 为此类索引中的最小;然后,在位置 k 处的字符具有较小值的字符串(通过使用 < 运算符确定)按字典顺序位于另一个字符串之前。在这种情况下, compareTo 返回两个字符串中位置 k 处的两个字符值的差 [...]

所以基本上,它将每个字符串视为 16 位无符号整数序列。没有文化意识,没有对复合字符等的理解。如果你想要更复杂的排序,你应该看看Collator.

于 2011-10-24T11:38:29.380 回答
7

在 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 数据库使用的字符集获得不同的比较行为。

于 2011-10-24T11:39:31.133 回答
2

来自javadocs

比较基于字符串中每个字符的 Unicode 值。

更详细:

这是字典顺序的定义。如果两个字符串不同,则它们在某个索引处具有不同的字符,该索引是两个字符串的有效索引,或者它们的长度不同,或两者兼而有之。如果它们在一个或多个索引位置具有不同的字符,则设 k 为此类索引中的最小;然后,在位置 k 处的字符具有较小值的字符串(通过使用 < 运算符确定)按字典顺序位于另一个字符串之前。在这种情况下, compareTo 返回两个字符串中位置 k 处的两个字符值的差...

于 2011-10-24T11:38:32.797 回答
0

希望这可以帮助!!

员工根据分数的降序排序,如果两个不同的员工得分相同,那么我们需要考虑员工姓名进行字典排序。

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;
}
于 2016-08-21T15:25:00.587 回答