Могу ли я использовать компаратор без реализации Comparable?

Можно ли использовать Comparator без реализации класса Comparable? Например, если бы у меня было следующее:

MyClass {

     Comparator comp;

     OrderedListInheritance(Comparator c) {
          this.comp = c;
     }

}

Могу ли я тогда использовать comp для сравнения двух объектов? Если да, то как мне это сделать?

Спасибо...


person littleK    schedule 08.12.2009    source источник


Ответы (3)


Вы не используете Comparable. Вы используете Comparator.

Comparable - это интерфейс, реализованный объектами для определения порядка их сортировки с другими объектами того же типа.

Comparator - это общий интерфейс, который просто берет два объекта и сообщает вам порядок их сортировки. Итак, вы можете:

public class Student {
  private final int id;
  private final String name;
  private final int age; 

  public Student(int id, String name, int age) {
    this.id = id;
    this.name = name;
    this.age = age;
  }

  public int getId() { return id; }
  public String getName() { return name; }
  public int getAge() { return age; }
}

с участием:

public class AgeComparator implements Comparator<Student> {
  public int compare(Student s1, Student s2) {
    if (s1.getAge() == s2.getAge()) {
      return 0;
    } else {
      return s1.getAge() < s2.getAge() ? -1 : 1;
  }
}

и:

List<Student> students = new ArrayList<Student>();
students.add(new Student(1, "bob", 15));
students.add(new Student(2, "Jane", 14));
students.add(new Student(3, "Gary", 16));

SortedSet<Student> set1 = new TreeSet<Student>(new AgeComparator());
set1.addAll(students);
for (Student student : set1) {
  // age order
}
person cletus    schedule 08.12.2009

Comparator<T> имеет public int compare(T lhs, T rhs). Так что используйте этот метод для сравнения объектов.

Кроме того, отсортированные коллекции будут принимать Comparator в качестве аргумента, поэтому вы можете (например) сказать:

Comparator<Integer> comparator = new Comparator<Integer>() {
  @Override public int compare(Integer lhs, Integer rhs) {
    if (rhs.intValue() < lhs.intValue())
      return -1;
    else if (rhs.intValue() > lhs.intValue())
      return 1;
    else 
      return 0;
  }
};
new TreeMap<Integer, Integer>(comparator);

Чтобы создать древовидную карту, в которой порядок сортировки (в данном случае) обратный.

person daveb    schedule 08.12.2009
comment
Это звучит глупо, но что, если я не знаю, какой тип объектов сравниваю? Итак, если я изменил метод сравнения на accept (Object a, Object b), могу ли я продолжить и сравнить объекты? Или проверьте, чтобы увидеть тип объектов, а затем сравнить? - person littleK; 08.12.2009
comment
@behrk - если вы не знаете типы объектов, что означает меньше чем? Вы ограничены (возможно) бессмысленным порядком, таким как порядок хэш-кода и порядок значений toString (). - person Stephen C; 08.12.2009

да.

Comparator и Comparable - это две отдельные и независимые сущности, только их назначение схоже.

В вашем коде просто выполните: comp.compare(obj1, obj2)

person Suraj Chandran    schedule 08.12.2009