Могу ли я использовать Comparator без реализации Comparable? - PullRequest
0 голосов
/ 08 декабря 2009

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

MyClass {

     Comparator comp;

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

}

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

Спасибо ...

Ответы [ 3 ]

5 голосов
/ 08 декабря 2009

Вы не используете 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
}
4 голосов
/ 08 декабря 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);

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

0 голосов
/ 08 декабря 2009

Да.

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

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...