我碰巧遇到了许多类似的陈述,如果在排序数组或集合和比较器以进行总排序时需要自然排序时使用。
您所听到的版本可能相同或不同,具有相同的含义,但最终是两者之间的区别因素(比较器和类似接口)。
但是,我无处可寻找两种类型的排序。 如果有人可以用一个很好的例子来解释它,那将非常感激:)
答案 0 :(得分:28)
总排序意味着可以将所有值与所有其他值进行比较。例如,如果您有BigDecimal
和String
的集合,则没有自然的总订单(但您可以发明一个)
在Java中,自然顺序被定义为JVM提供的顺序。这可能与人们可能认为的自然秩序不符。例如字符串按ASCII排序。含义Z
在a
之前,10
在2
之前
http://docs.oracle.com/javase/7/docs/api/java/lang/Comparable.html
此接口对实现它的每个类的对象强加一个总排序。这种排序被称为类的自然排序,类的compareTo方法被称为其自然比较方法。
答案 1 :(得分:10)
Total ordering是一个通用的数学概念。它与部分排序的不同之处在于,对于集合 X 中的每个 a 和 b ,要么“ a< = b “或” b< = a “是有意义且真实的。就Java而言,这意味着两个Comparable
实例中的一个必须大于或等于另一个(即比较它们是有意义的。)
答案 2 :(得分: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);
}
比较器接口:
此接口表示订单关系,可用于对已排序的集合或映射中的列表进行排序或维护订单。可以覆盖类型的自然顺序,或者对未实现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.
答案 3 :(得分:8)
重点: 自然排序应与等于一致!
摘要:自然排序是一种总排序,它是给定类的默认值(最常使用)并且与equals一致。总排序是任何排序,其中所有值都可以与所有其他值进行比较。
例如当你设计新类时,你可以选择类中的自然顺序。任何其他排序只能是总数;)
答案 4 :(得分:5)
详细说明@ Bruno的答案:部分排序的一个例子是正数之间的可分性关系。如果你比较5和15,你可以说5是15的除数,15是5的倍数。但是,3和5是不可比的,因为3既不是除数也不是5的倍数。
总排序的一个例子是小于关系,因为如果你取两个不同的数字,其中一个比另一个小。所以任何价值都可以与任何其他价值相媲美。
关于自然排序的概念:如果一个类型的对象具有非常明显的排序方式,那么它就是自然排序。例如,字符串的自然顺序是字母顺序,数字的自然顺序是升序,因为它是任何人都会想到的第一选择。但是,有时您会想要以不同的方式订购字符串,例如按长度排序从1个字符到长字符。这是Strings可能的总排序,但不是自然排序。
并非所有对象都必然具有自然顺序。例如。如果你有Person对象,按高度排序可能是总排序,但按年龄排序也是如此...这些都不比另一个更明显,这就是没有自然排序的原因。
答案 5 :(得分:4)
自然排序是默认的总排序。这是两者之间的唯一区别。
答案 6 :(得分:0)
Comparable
实现为类提供自然顺序,允许自动对该类的对象进行排序。 (参考:https://docs.oracle.com/javase/tutorial/collections/interfaces/order.html)
Comparable
接口的实施强制执行总排序,或者能够从头到尾对整个数组进行排序。