Java比较器和可比的

时间:2012-09-17 10:47:09

标签: java

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

感谢您的帮助。

4 个答案:

答案 0 :(得分: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;
  }
}

这是一个具有姓氏自然排序顺序的类,然后是名字,即Stephen Jones出现在John Smith之前。

如果你想用名字和姓氏对这些对象进行排序,那么John Smith会在Stephen Jones之前使用比较器

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的类,但您可以将其子类化以实现该接口,并且您确信您将是唯一创建实例的人,那么您可以使用{{ 1}}。

但是,一般来说,Comparable更灵活。

答案 1 :(得分: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.

答案 2 :(得分:0)

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

class MyComparator implements Comparator<MyClass>{

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

使用比较器为您提供了更多自定义。

答案 3 :(得分:0)

简单回答

转到比较器

两个概念的摘要

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

<强>可比

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

<强>比较

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

考虑您现有的班级

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