【发布时间】:2012-02-28 21:41:27
【问题描述】:
我碰巧遇到了许多语句,例如在对数组或集合进行排序时需要自然排序时使用可比较的语句,而比较器则用于总排序。
您可能听说过的版本可能相同或不同,但具有相同的含义,但最终它是两者之间的区别因素之一(比较器和可比较的接口)。
但是,我在任何地方都找不到这两种订购类型之间的区别。 如果有人能用一个很好的例子来解释它,我将不胜感激:)
【问题讨论】:
标签: java arrays sorting collections
我碰巧遇到了许多语句,例如在对数组或集合进行排序时需要自然排序时使用可比较的语句,而比较器则用于总排序。
您可能听说过的版本可能相同或不同,但具有相同的含义,但最终它是两者之间的区别因素之一(比较器和可比较的接口)。
但是,我在任何地方都找不到这两种订购类型之间的区别。 如果有人能用一个很好的例子来解释它,我将不胜感激:)
【问题讨论】:
标签: java arrays sorting collections
总排序意味着所有值都可以与所有其他值进行比较。例如,如果您有 BigDecimal 和 String 的集合,则没有自然的全序(但您可以发明一个)
在 Java 中,自然顺序定义为 JVM 提供的顺序。这可能与人们可能认为的自然秩序不符。例如字符串按 ASCII 顺序排序。意思是大写Z在小写a之前,10在2之前
http://docs.oracle.com/javase/7/docs/api/java/lang/Comparable.html
此接口对实现它的每个类的对象进行总排序。这种排序称为类的自然排序,类的 compareTo 方法称为其自然比较方法。
【讨论】:
z 如何排在a 之前?你能确认这是准确的吗? gist.github.com/kmb385demo/d580f0c47b359eba9b41b6e35293d2ce
z,正如您从我的示例中看到的那样。感谢您指出这一点,您让我质疑我所学到的一切!我为视力下降的老年开发人员做了一个快速编辑。
Comparable 实现为类提供了自然排序,允许该类的对象自动排序。 (参考:https://docs.oracle.com/javase/tutorial/collections/interfaces/order.html)
Comparable 接口的实现强制执行总排序或从头到尾对整个数组进行排序的能力。
【讨论】:
详细说明@Bruno 的回答:部分排序的一个例子是正数之间的可分关系。如果比较 5 和 15,可以说 5 是 15 的除数,15 是 5 的倍数。但是,3 和 5 不可比,因为 3 既不是 5 的除数,也不是 5 的倍数。
总排序的一个例子是小于关系,因为如果你取任意两个不同的数,其中一个小于另一个。所以任何值都可以与任何其他值进行比较。
关于自然排序的概念:如果一个类型的对象有一种非常明显的排序方式,那么它就是自然排序。例如,字符串的自然顺序是字母顺序,数字的自然顺序是升序,因为这是任何人都会想到的第一选择。但是,有时您可能希望以不同的方式订购字符串,例如按长度从 1 个字符到更长的字符排序。这可能是对字符串的总排序,但不是自然排序。
并非所有对象都必然具有自然顺序。例如。如果你有 Person 对象,按高度对它们进行排序是一种可能的总排序,但按年龄排序也是如此……这些都比另一个更明显,这就是为什么没有自然排序的原因。
【讨论】:
重点: 自然排序应该与equals一致!
总结: 自然排序是一种总排序,它是给定类的默认(最常使用)并且与 equals 一致。总排序是所有值都可以与所有其他值进行比较的任何排序。
例如当你设计新类时,你可以选择类内的自然顺序。任何其他排序都只能是总一个;)
【讨论】:
自然规律
这取决于我们使用的集合,例如,我们有字符对象,那么自然顺序就是它们的 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.
【讨论】:
Total ordering 是一个通用的数学概念。它与偏序的主要区别在于对于集合 X 中的每个 a 和 b,“a " 或 "b " 是有意义且真实的。就 Java 而言,这意味着在两个 Comparable 实例中,一个必须大于或等于另一个(即比较它们是有意义的)。
【讨论】:
自然排序是默认的总排序。这是两者之间的唯一区别。
【讨论】: