你所听到的版本可能相同或不同,但最终这是区分两种接口(comparator和comparable)之间差异的其中一个因素。
但是,我在任何地方都找不到这两种排序方式之间的区别。如果有人能用一个好的例子来解释一下,我会非常感激 :)
总排序意味着所有值都可以相互比较。例如,如果您有一个包含BigDecimal
和String
的集合,则没有自然的总排序(但您可以发明一个)
在Java中,自然顺序被定义为JVM提供的顺序。这可能与人们认为的自然顺序不同。例如,字符串按照ASCII字符顺序排序。这意味着大写字母Z
在小写字母a
之前,而数字10
在2
之前。
http://docs.oracle.com/javase/7/docs/api/java/lang/Comparable.html
此接口对实现它的每个类的对象强制执行总排序。此排序称为类的自然排序,并且类的compareTo方法称为其自然比较方法。
自然顺序
它取决于我们使用的集合,例如,假设我们有一个字符对象,那么自然顺序是它们的Unicode值,对于数字,自然顺序是通常的升序。
Comparable接口- 该接口对实现它的每个类的对象强制执行总排序。这种排序称为类的自然排序,而类的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.
全序关系是一个通用的数学概念。它与偏序关系的主要区别在于,对于集合X中的每个元素a和b,要么“a <= b”成立,要么“b <= a”成立。就Java而言,这意味着在两个Comparable
实例中,必须有一个大于或等于另一个(即比较它们是有意义的)。
重要提示: 自然排序 应该与相等关系一致!
总结: 自然排序是一种全序,它是给定类的默认排序方式,并且与相等关系一致。全序是任何值都可以与其他所有值进行比较的排序方式。
例如: 当您设计新类时,可以选择在该类内部使用自然排序。其他任何排序方式都必须是全序的 ;)
Comparable
接口的类提供了一种自然排序方法,可以使该类的对象自动排序。(参考:https://docs.oracle.com/javase/tutorial/collections/interfaces/order.html)Comparable
接口强制执行全序关系或者能够从开头到结尾对整个数组进行排序的能力。
z
要排在a
前面?您能确认这是准确的吗?https://gist.github.com/kmb385demo/d580f0c47b359eba9b41b6e35293d2ce - Kevin Bowersoxz
,就像你从我的例子中看到的那样。谢谢你指出来,你让我开始怀疑我所学习的一切!我为老年开发者做了一个快速修改,以帮助他们变得更加清晰易见。 - Kevin Bowersox