自然排序和全排序的区别

Posted

技术标签:

【中文标题】自然排序和全排序的区别【英文标题】:difference between natural ordering and total ordering 【发布时间】:2012-02-28 21:41:27 【问题描述】:

我碰巧遇到了许多语句,例如在对数组或集合进行排序时需要自然排序时使用可比较的语句,而比较器则用于总排序。

您可能听说过的版本可能相同或不同,但具有相同的含义,但最终它是两者之间的区别因素之一(比较器和可比较的接口)。

但是,我在任何地方都找不到这两种订购类型之间的区别。 如果有人能用一个很好的例子来解释它,我将不胜感激:)

【问题讨论】:

【参考方案1】:

总排序意味着所有值都可以与所有其他值进行比较。例如,如果您有 BigDecimalString 的集合,则没有自然的全序(但您可以发明一个)

在 Java 中,自然顺序定义为 JVM 提供的顺序。这可能与人们可能认为的自然秩序不符。例如字符串按 ASCII 顺序排序。意思是大写Z在小写a之前,102之前

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

此接口对实现它的每个类的对象进行总排序。这种排序称为类的自然排序,类的 compareTo 方法称为其自然比较方法。

【讨论】:

您所说的所有值都可以与所有其他值进行比较究竟是什么意思。您能详细说明一下吗? @AbhinavVutukuri 在集合中你可以说有些是可比的,有些则不是。所有值都必须与其他所有值具有可比性。 @PeterLawrey 在订购字符串时,z 如何排在a 之前?你能确认这是准确的吗? gist.github.com/kmb385demo/d580f0c47b359eba9b41b6e35293d2ce @KevinBowersox 案例在 Java 中很重要。大写 Z 在小写 a 之前。 ideone.com/fXjyo8 @PeterLawrey 是时候调高显示器分辨率了(新行也无济于事)。我认为这是一个小写的z,正如您从我的示例中看到的那样。感谢您指出这一点,您让我质疑我所学到的一切!我为视力下降的老年开发人员做了一个快速编辑。【参考方案2】:

Comparable 实现为类提供了自然排序,允许该类的对象自动排序。 (参考:https://docs.oracle.com/javase/tutorial/collections/interfaces/order.html)

Comparable 接口的实现强制执行总排序或从头到尾对整个数组进行排序的能力。

【讨论】:

【参考方案3】:

详细说明@Bruno 的回答:部分排序的一个例子是正数之间的可分关系。如果比较 5 和 15,可以说 5 是 15 的除数,15 是 5 的倍数。但是,3 和 5 不可比,因为 3 既不是 5 的除数,也不是 5 的倍数。

总排序的一个例子是小于关系,因为如果你取任意两个不同的数,其中一个小于另一个。所以任何值都可以与任何其他值进行比较。

关于自然排序的概念:如果一个类型的对象有一种非常明显的排序方式,那么它就是自然排序。例如,字符串的自然顺序是字母顺序,数字的自然顺序是升序,因为这是任何人都会想到的第一选择。但是,有时您可能希望以不同的方式订购字符串,例如按长度从 1 个字符到更长的字符排序。这可能是对字符串的总排序,但不是自然排序。

并非所有对象都必然具有自然顺序。例如。如果你有 Person 对象,按高度对它们进行排序是一种可能的总排序,但按年龄排序也是如此……这些都比另一个更明显,这就是为什么没有自然排序的原因。

【讨论】:

【参考方案4】:

重点: 自然排序应该与equals一致

总结: 自然排序是一种总排序,它是给定类的默认(最常使用)并且与 equals 一致。总排序是所有值都可以与所有其他值进行比较的任何排序。

例如当你设计新类时,你可以选择类内的自然顺序。任何其他排序都只能是总一个;)

【讨论】:

您所说的所有值都可以与所有其他值进行比较究竟是什么意思。您能详细说明一下吗?【参考方案5】:

自然规律

这取决于我们使用的集合,例如,我们有字符对象,那么自然顺序就是它们的 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.                    

【讨论】:

【参考方案6】:

Total ordering 是一个通用的数学概念。它与偏序的主要区别在于对于集合 X 中的每个 ab,“a " 或 "b " 是有意义且真实的。就 Java 而言,这意味着在两个 Comparable 实例中,一个必须大于或等于另一个(即比较它们是有意义的)。

【讨论】:

【参考方案7】:

自然排序是默认的总排序。这是两者之间的唯一区别。

【讨论】:

那是我没有得到的。这对我来说就像一个谜。你能解释一下默认排序是什么意思吗 大声笑我知道,但正如我所说的,当你说自然原因时,我不太理解它的含义对我来说是模棱两可的:( 在定义对象时,可以选择在没有提供其他排序时使用的排序。因此,通常实现在实践中最常用的排序。 @Ha。但是什么是总排序 @AnV - 假设您有一个“学生”类,然后根据“学生”类的多个/不同元素对学生集合进行排序称为总排序。

以上是关于自然排序和全排序的区别的主要内容,如果未能解决你的问题,请参考以下文章

hiho 第214周 Sorting Photo Files(排序)

TreeSet ------自然排序与定制排序(比较器)

对数组进行排序

TreeSet之定制排序和自然排序

归并排序(递归非递归以及自然归并排序)算法总结

吴裕雄--天生自然数据结构:十大经典排序算法——希尔排序