Написание класса Comparator по умолчанию в Java

Я реализую общий класс кучи в Java. Для этого класса есть два конструктора, один из которых является конструктором по умолчанию без параметров. Другой принимает объект сравнения, который пользователь может передать, чтобы пользователь мог контролировать, как сравниваются элементы кучи. Теперь, если пользователь использует конструктор по умолчанию, я хочу, чтобы мой класс использовал объект компаратора по умолчанию. Метод сравнения этого объекта просто вызывает метод compareTo() (часть интерфейса Comparable). Есть ли способ сделать это и если да, то как?


person user1210233    schedule 20.10.2012    source источник


Ответы (4)


Я предполагаю, что общий компаратор будет выглядеть так:

public class ComparableComparator<T extends Comparable<T>> implements Comparator<T> {
  @Override
  public int compare(T lhs, T rhs) {
    return lhs.compareTo(rhs);
  }  
}
person Vincent Mimoun-Prat    schedule 20.10.2012
comment
разве это не должно быть Comparable‹T›? - person DaveFar; 21.10.2012

Используйте ComparableComparator из Apache Commons. который берет два произвольных Object и сравнивает их, реализуют ли они Comparable.

В качестве альтернативы конструктор, который не принимает компаратор, должен применять параметр типа K extends Comparable<K>.

person Tomasz Nurkiewicz    schedule 20.10.2012

В Java 8 есть Comparator.naturalOrder(), который вы можете использовать в качестве компаратора по умолчанию. См. API java.util.Comparator для подробностей.

person Vivit    schedule 30.11.2016

Guava обеспечивает "естественное упорядочение" Comparator как - достаточно предсказуемо - Ordering.natural().

person Louis Wasserman    schedule 20.10.2012