Java中的词典顺序

时间:2011-10-24 11:33:34

标签: java lexicographic

如何在Java中定义词典顺序,尤其是在引用!.等特殊字符时?

可以找到例外订单here

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

4 个答案:

答案 0 :(得分:24)

来自String.compareTo的文档:

  

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

  

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

中位置k处两个字符值的差值

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

答案 1 :(得分: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数据库使用的字符集,您可以获得不同的比较行为。

答案 2 :(得分:2)

来自javadocs

  

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

更详细:

  

这是词典排序的定义。如果有两个字符串       不一样的话       要么它们在某个索引上有不同的字符,这两个索引都是两者的有效索引       字符串,或它们的长度不同,或两者兼而有之。如果他们有不同的角色       在一个或多个索引位置,令k为最小的索引;然后是其中的字符串       位置k处的字符具有较小的值,如通过使用<运营商,       按字典顺序排列在另一个字符串之前。在这种情况下,compareTo返回       两个字符串中位置k处两个字符值的差异...

答案 3 :(得分: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;
}