4

我在java中只有类文件,没有源代码,现在我必须对它们进行排序,我应该使用Comparator还是Comparable?

感谢你的帮助。

4

4 回答 4

4

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它更灵活。

于 2012-09-17T10:56:19.563 回答
0

如果可能,您可以扩展该类并编写一个新类,该类实现 Comparable,以便您可以实现 compareTo()。在其他情况下,您可以使用 Comparator as given ,

class MyComparator implements Comparator<MyClass>{

    @Override
    public int compare(MyClass o1, MyClass o2) {
        return o1.getType().compareTo(o2.getType());
    }
}

使用比较器可为您提供更多所需的自定义。

于 2012-09-17T12:01:01.953 回答
0

如果您无权访问源文件,请使用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.
于 2012-09-17T11:07:24.870 回答
0

简单的答案

比较器。

两个概念的总结

(摘自http://www.digizol.com/2008/07/java-sorting-comparator-vs-comparable.html

可比

一个可比较的对象能够将自己与另一个对象进行比较。类本身必须实现 java.lang.Comparable 接口才能比较其实例。

比较器

比较器对象能够比较两个不同的对象。该类不是比较它的实例,而是比较其他一些类的实例。此比较器类必须实现 java.util.Comparator 接口。

考虑您现有的课程

您当前的课程已经实施。即使它已经有一个 Comparable 实现,您也不知道该比较是如何实现的;因此你无法预测你的排序。当您不修改要排序的类的源时,唯一的选择是使用 Comparator。

于 2017-11-13T20:27:24.097 回答