簡體   English   中英

自然排序和總排序的區別

[英]difference between natural ordering and total ordering

我碰巧遇到許多語句,例如在對數組或集合和比較器進行排序以進行總排序時需要自然排序時使用可比較。

您可能聽說過的版本可能相同或不同,但具有相同的含義,但最終它是兩者(比較器和可比較接口)之間的區別因素之一。

但是,我在任何地方都找不到這兩種訂購方式的區別。 如果有人能用一個很好的例子來解釋它,我將不勝感激:)

總排序意味着所有值都可以與所有其他值進行比較。 例如,如果您有一個BigDecimalString的集合,則沒有自然的全序(但您可以發明一個)

在 Java 中,自然順序被定義為 JVM 提供的排序。 這可能與人們可能認為的自然秩序不符。 例如,字符串按 ASCII 順序排序。 意思是大寫Z在小寫a之前, 102之前

http://docs.oracle.com/javase/7/docs/api/java/lang/Comparable.html

該接口對實現它的每個類的對象強加了總排序。 這種排序稱為類的自然排序,類的 compareTo 方法稱為其自然比較方法。

重點:自然排序應該與 equals 一致

總結:自然排序是一種總排序,它是給定類的默認值(最常使用)並且與 equals 一致。 總排序是所有值都可以與所有其他值進行比較的任何排序。

例如,當您設計新類時,您可以選擇類內的自然順序。 任何其他排序都只能是總數;)

全序是一個通用的數學概念。 它與偏序的主要區別在於,對於集合X 中的每個ab ,“ a <= b ”或“ b <= a ”是有意義且正確的。 就 Java 而言,這意味着對於兩個Comparable實例,一個必須大於或等於另一個(即比較它們是有意義的)。

自然秩序

這取決於我們使用的集合,例如,我們有字符對象,那么自然順序是它們的 unicode 值,對於數字,自然順序和往常一樣,升序

可比較的接口——這個接口對實現它的每個類的對象強加了一個總排序。 這種排序稱為類的自然排序,類的 compareTo 方法稱為其自然比較方法。

實現此接口的對象列表(和數組)可以通過 Collections.sort(和 Arrays.sort)自動排序。 實現此接口的對象可以用作排序映射中的鍵或排序集中的元素,而無需指定比較器。

public interface Comparable<T> {

    /**
     * Compares this object with the specified object for order.  Returns a
     * negative integer, zero, or a positive integer as this object is less
     * than, equal to, or greater than the specified object.
     */
    public int compareTo(T o);
}

比較器接口:

該接口代表一個順序關系,可以用來對一個列表進行排序,或者維護一個有序集合或映射中的順序。 可以覆蓋類型的自然排序,或對未實現 Comparable 接口的類型的對象進行排序。

一個比較函數,它對“某些對象集合”施加總排序。 比較器可以傳遞給排序方法(例如 Collections.sort)以允許精確控制排序順序。 比較器還可用於控制某些數據結構(例如 TreeSet 或 TreeMap)的順序。

    public interface Comparator<T> {
    /**
     * Compares its two arguments for order.  Returns a negative integer,
     * zero, or a positive integer as the first argument is less than, equal
     * to, or greater than the second.
     */
    int compare(T o1, T o2);

    boolean equals(Object obj);
}

Hope This helps you.                    

詳細說明@Bruno 的回答:偏序的一個例子是正數之間的可分性關系 如果比較 5 和 15,可以說 5 是 15 的約數,15 是 5 的倍數。 但是,3 和 5 沒有可比性,因為 3 既不是 5 的約數,也不是 5 的倍數。

總排序的一個例子是小於關系,因為如果你取任何兩個不同的數字,其中一個小於另一個。 因此,任何值都可以與任何其他值進行比較。

關於自然排序的概念:如果一個類型的對象有一個非常明顯的排序方式,那么它就是自然排序。 例如,字符串的自然順序是字母順序,數字的自然順序是升序,因為這是任何人都會想到的第一選擇。 但是,有時您會希望以不同的方式對字符串進行排序,例如按長度從 1 個字符的到較長的排序。 這是對字符串的一種可能的總排序,但不是自然排序。

並非所有對象都必須具有自然順序。 例如,如果您有 Person 對象,按高度對它們進行排序是一種可能的總排序,但按年齡對它們進行排序也是如此......這些都沒有比另一個更明顯,這就是沒有自然排序的原因。

自然排序是默認的總排序。 這是兩者的唯一區別。

Comparable實現為類提供了自然的排序,這允許自動排序該類的對象。 (參考: https : //docs.oracle.com/javase/tutorial/collections/interfaces/order.html

Comparable接口的實現強制執行總排序或從頭到尾對整個數組進行排序的能力。

暫無
暫無

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

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