Java中的词典顺序

osc*_*enk 11 java lexicographic

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

可以在此处找到示例订单

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

Jon*_*eet 24

来自以下文档String.compareTo:

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

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

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


小智 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
Run Code Online (Sandbox Code Playgroud)

如果它不是UTF-8,那么您可以根据Oracle数据库使用的字符集获得不同的比较行为.

  • 虽然这个评论对我有帮助,但由于问题的措辞,我将@jonskeet的答案标记为正确.事实证明,数据库使用`alutf8`编码(默认)而不是`utf8`.出于测试目的,我使用`utf8`设置了一个数据库,所有内容都按预期排序.`alutf8`命令"." 在使用'utf8`导致"."之后的字符(对我而言是"M")之后.在"M"之前订购.很烦人. (2认同)