繁体   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