簡體   English   中英

Java 中的字典順序

[英]Lexicographic Order in Java

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 根據分數的降序排序,如果兩個不同的員工有相同的分數,那么我們需要考慮 Employee name 進行字典序排序。

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;
}

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM