自然排序和总排序之间的差异

Nav*_*Nav 40 java arrays sorting collections

我碰巧遇到了许多类似的声明,如果在排序数组或集合和比较器以进行总排序时需要自然排序时使用.

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

但是,我无处可寻找两种类型的排序.如果有人可以用一个很好的例子解释它,将非常感谢:)

Pet*_*rey 28

总排序意味着可以将所有值与所有其他值进行比较.例如,如果你有一个集合,BigDecimal并且String没有自然的总订单(但你可以发明一个)

在Java中,自然顺序被定义为JVM提供的顺序.这可能与人们可能认为的自然秩序不符.例如,字符串按ASCII排序.意思Z出现在之前a10之前2

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

此接口对实现它的每个类的对象强加一个总排序.这种排序被称为类的自然排序,类的compareTo方法被称为其自然比较方法.

  • 究竟是什么意思**所有值都可以与所有其他值进行比较.**你能详细说明一下吗? (2认同)
  • @PeterLawrey 是时候调高显示器分辨率了(新行也无济于事)。我认为这是一个小写的 `z`,正如你从我的例子中看到的那样。感谢您指出这一点,您让我质疑我所学到的一切!我为视力下降的老年开发人员进行了快速编辑。 (2认同)

Bru*_*uno 10

总排序是一般数学概念.它主要与部分排序的不同之处在于,对于集合X中的每个ab," a <= b "或" b <= a "是有意义且真实的.就Java而言,这意味着在两个实例中,一个必须大于或等于另一个实例(即比较它们是有意义的).Comparable


Jav*_*ava 8

自然秩序

这取决于我们使用的集合,例如,我们有字符对象,然后自然顺序是它们的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);
}
Run Code Online (Sandbox Code Playgroud)

比较器接口:

此接口表示订单关系,可用于对排序集或映射中的列表进行排序或维护订单.可以覆盖类型的自然顺序,或者对未实现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.                    
Run Code Online (Sandbox Code Playgroud)


chi*_*iik 8

重点: 自然排序应该与平等一致!

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

例如,当您设计新课程时,您可以选择课程内的自然顺序.任何其他排序只能是总数;)


And*_*sza 6

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

总排序的一个例子是小于关系,因为如果你取两个不同的数字,其中一个小于另一个.因此任何价值都可与任何其他价值相媲美.

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

并非所有对象都必然具有自然顺序.例如,如果你有Person对象,按高度排序可能是总排序,但是按年龄排序它们......这些都不比另一个更明显,这就是没有自然排序的原因.