我在java中只有类文件,没有源代码,现在我必须对它们进行排序,我应该使用Comparator还是Comparable?
感谢你的帮助。
Comparable
是由知道如何将自己与该类的另一个实例进行比较的类实现的接口。
Comparator
是用于比较不同类的两个实例的接口。
如果你有一Person
堂课,例如
public class Person implements Comparable<Person> {
private final String firstName;
private final String lastName;
...
public int compareTo(Person that) {
int rv = lastName.compareTo(that.lastName);
if (rv == 0)
rv = firstName.compareTo(that.firstName);
return rv;
}
}
这是一个按姓氏然后按名字的自然排序顺序,即斯蒂芬琼斯排在约翰史密斯之前。
如果您想按名字和姓氏对这些对象进行排序,这样 John Smith 排在 Stephen Jones 之前,您可以使用 Comparator
public class PersonComparator implements Comparator<Person> {
public int compare(Person p1, Person p2) {
int rv = p1.getFirstName().compareTo(p2.getFirstName());
if (rv == 0)
rv = p1.getLastName().compareTo(p2.getLastName());
return rv;
}
}
您使用哪个取决于您对类和实例的控制。
例如,如果您有一个未实现的类Comparable
,但您可以将其子类化以实现接口,并且您确定您将是唯一创建实例的人,那么您可以使用Comparable
.
但是,总的来说,Comparator
它更灵活。
如果可能,您可以扩展该类并编写一个新类,该类实现 Comparable,以便您可以实现 compareTo()。在其他情况下,您可以使用 Comparator as given ,
class MyComparator implements Comparator<MyClass>{
@Override
public int compare(MyClass o1, MyClass o2) {
return o1.getType().compareTo(o2.getType());
}
}
使用比较器可为您提供更多所需的自定义。
如果您无权访问源文件,请使用Comparator
对它们进行排序。
class MyComparator implements Comparator<MyClass>{
@Override
public int compare(MyClass o1, MyClass o2) {
return o1.getType().compareTo(o2.getType());
}
}
// where getType is the getter method of the field on which you want to sort.
去比较器。
(摘自http://www.digizol.com/2008/07/java-sorting-comparator-vs-comparable.html)
可比
一个可比较的对象能够将自己与另一个对象进行比较。类本身必须实现 java.lang.Comparable 接口才能比较其实例。
比较器
比较器对象能够比较两个不同的对象。该类不是比较它的实例,而是比较其他一些类的实例。此比较器类必须实现 java.util.Comparator 接口。
您当前的课程已经实施。即使它已经有一个 Comparable 实现,您也不知道该比较是如何实现的;因此你无法预测你的排序。当您不修改要排序的类的源时,唯一的选择是使用 Comparator。