自然排序和全排序的区别
Posted
技术标签:
【中文标题】自然排序和全排序的区别【英文标题】:difference between natural ordering and total ordering 【发布时间】:2012-02-28 21:41:27 【问题描述】:我碰巧遇到了许多语句,例如在对数组或集合进行排序时需要自然排序时使用可比较的语句,而比较器则用于总排序。
您可能听说过的版本可能相同或不同,但具有相同的含义,但最终它是两者之间的区别因素之一(比较器和可比较的接口)。
但是,我在任何地方都找不到这两种订购类型之间的区别。 如果有人能用一个很好的例子来解释它,我将不胜感激:)
【问题讨论】:
【参考方案1】:总排序意味着所有值都可以与所有其他值进行比较。例如,如果您有 BigDecimal
和 String
的集合,则没有自然的全序(但您可以发明一个)
在 Java 中,自然顺序定义为 JVM 提供的顺序。这可能与人们可能认为的自然秩序不符。例如字符串按 ASCII 顺序排序。意思是大写Z
在小写a
之前,10
在2
之前
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 中的每个 a 和 b,“a " 或 "b " 是有意义且真实的。就 Java 而言,这意味着在两个 Comparable
实例中,一个必须大于或等于另一个(即比较它们是有意义的)。
【讨论】:
【参考方案7】:自然排序是默认的总排序。这是两者之间的唯一区别。
【讨论】:
那是我没有得到的。这对我来说就像一个谜。你能解释一下默认排序是什么意思吗 大声笑我知道,但正如我所说的,当你说自然原因时,我不太理解它的含义对我来说是模棱两可的:( 在定义对象时,可以选择在没有提供其他排序时使用的排序。因此,通常实现在实践中最常用的排序。 @Ha。但是什么是总排序? @AnV - 假设您有一个“学生”类,然后根据“学生”类的多个/不同元素对学生集合进行排序称为总排序。以上是关于自然排序和全排序的区别的主要内容,如果未能解决你的问题,请参考以下文章