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

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

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

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

【问题讨论】:

    标签: java arrays sorting collections


    【解决方案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 - 假设您有一个“学生”类,然后根据“学生”类的多个/不同元素对学生集合进行排序称为总排序。
            最近更新 更多