一个类什么时候应该是 Comparable 和/或 Comparator?[关闭]
-
10-07-2019 - |
题
我见过同时实现这两个功能的类 可比 和 比较器. 。这是什么意思?我为什么要使用其中一种而不是另一种?
解决方案
以下文字来自 Comparator vs Comparable 一>
<强>可比强>
可比对象能够将自己与另一个对象进行比较。类本身必须实现java.lang.Comparable
接口才能比较其实例。
<强>比较强>
比较器对象能够比较两个不同的对象。该类不是比较它的实例,而是比较其他一些类<!>#8217; s实例。此比较器类必须实现java.util.Comparator
接口。
其他提示
实施Comparable
意味着<!>“我可以将自己与另一个对象进行比较。 <!> quot;当存在单个自然默认比较时,这通常很有用。
实施Comparator
表示<!>“我可以比较其他两个对象。 <!> quot;当有多种方法比较两种类型的实例时,这通常很有用 - 例如你可以按年龄,姓名等来比较人。
Comparable 让类实现自己的比较:
- 在里面 同一个班级 (这通常是一个优势)
- 可以有 只有一个实现 (所以如果你想要两种不同的情况就不能使用它)
相比之下,Comparator 是外部比较:
- 它通常位于唯一的实例中(在同一个类中或在另一个地方)
- 你 命名每个实现 按照您想要的方式排序
- 你可以提供比较器 您无法控制的类
- 实施是 即使第一个对象为空也可用
在这两种实现中,您仍然可以 选择您想要比较的内容。使用泛型,您可以声明它,并在编译时检查它。这提高了安全性,但确定适当的值也是一个挑战。
作为指导,在我设想的所有用例中,我通常使用可以与该对象进行比较的最通用的类或接口......虽然定义不是很精确!:-(
Comparable<Object>
允许您在编译时在所有代码中使用它(如果需要,这很好,如果不需要,则不好,并且您会丢失编译时错误);您的实现必须能够处理对象,并根据需要进行强制转换,但要以稳健的方式进行。Comparable<Itself>
恰恰相反,是非常严格的。
有趣的是,当您将 Itself 子类化为 Subclass 时,Subclass 也必须是可比较的并且具有鲁棒性(否则会违反里氏原则,并给您带来运行时错误)。
java.lang.Comparable
-
要实现
Comparable
接口,类必须实现单个方法compareTo()
int a.compareTo(b)
-
您必须修改要对其实例进行排序的类。因此,每个类只能创建一个排序序列。
醇>
-
要实现Comparator接口,类必须实现单个方法
compare()
int compare (a,b)
- 您构建一个与要对其实例排序的类分开的类。这样就可以为每个类创建多个排序顺序。 醇>
<强>了java.util.Comparator 强>
Comparable
用于为数据对象提供默认排序,例如,如果数据对象具有自然顺序。
Comparator
表示特定用途的订购本身。
Comparable
通常是首选。但有时一个类已经实现了Comparator
,但是你想要对不同的属性进行排序。然后你被迫使用Comparators
。
有些课程实际上为普通案件提供String
;例如, CASE_INSENSITIVE_ORDER
是在排序时默认区分大小写,但也有一个名为的rel = “noreferrer”> <=> 。
我在网上找到的Comparator和Comparable之间的差异很小:
-
如果你看到这两者之间的逻辑差异是Java中的Comparator比较提供给他的两个对象,而Comparable接口比较<!> quot; this <!> quot;引用指定的对象。
-
Java中的可比较用于实现对象的自然排序。在Java API String中,Date和wrapper类实现了Comparable接口。
-
如果任何类在Java中实现Comparable接口,那么可以使用Collections.sort()或Array.sort()方法自动对List或Array的集合进行排序,并且对象将根据其自然进行排序由CompareTo方法定义的订单。
-
在Java中实现Comparable的对象可以用作有序映射中的键或有序集合中的元素,例如TreeSet,而不指定任何Comparator。
醇>
网站:如何在Java中使用Comparator和Comparable?用例子
Comparable
用于具有自然排序的对象。对象本身知道如何订购。
Comparator
适用于没有自然排序的对象,或者您希望使用不同的顺序。
比较器和可比接口之间的区别
Comparable
用于通过使用另一个对象来比较自己。
Comparator
用于比较两种数据类型是对象。
如果您看到这两者之间的逻辑差异是Comparator
在Java中比较提供给他的两个对象,而Comparable
接口比较<!> quot; this <!> quot;引用指定的对象。
List
用于实现对象的自然排序。在Java API String中,Date和wrapper类实现Array
interface。
如果任何类在Java中实现Collections.sort()
接口,则可以使用Array.sort()
或compareTo
方法自动对该对象的集合TreeSet
或<=>进行排序,并且对象将根据自然顺序进行排序由<=>方法定义。
在Java中实现<=>的对象可以用作有序映射中的键或有序集合中的元素,例如<=>,而不指定任何<=>。
我的实现Comparable和Comparator的注释库:
public class Person implements Comparable<Person> {
private String firstName;
private String lastName;
private int age;
private char gentle;
@Override
@CompaProperties({ @CompaProperty(property = "lastName"),
@CompaProperty(property = "age", order = Order.DSC) })
public int compareTo(Person person) {
return Compamatic.doComparasion(this, person);
}
}
单击链接以查看更多示例。 比较