如何在Java中定义词典顺序,尤其是在引用!
,.
等特殊字符时?
可以找到例外订单here
但Java如何定义它的顺序?我问,因为我正在对Java和Oracle上的字符串进行排序,并得出不同的结果,并且找不到字典顺序的规范。
答案 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;
}