Компаратор Java

Кто-нибудь знает какую-то фабрику компараторов на Java с

public Comparator getComparatorForClass(Class clazz) {}

Он вернет компараторы для таких вещей, как String, Double, Integer, но будет иметь

public void addComparatorForClass(Class clazz, Comparator comparator) {}

Для произвольных типов.

Использование Comparable - хороший вариант. Такой завод вообще не имеет смысла.

Rastislav Komara 26.10.2008 14:02

Что бы он сделал для классов, у которых более одного компаратора? Например, Сотрудник, которого можно отсортировать по имени или идентификатору?

Macneil Shonle 01.01.2011 04:02
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
Как вычислять биты и понимать побитовые операторы в Java - объяснение с примерами
Как вычислять биты и понимать побитовые операторы в Java - объяснение с примерами
В компьютерном программировании биты играют важнейшую роль в представлении и манипулировании данными на двоичном уровне. Побитовые операции...
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Приходилось ли вам сталкиваться с требованиями, в которых вас могли попросить поднять тревогу или выдать ошибку, когда метод Java занимает больше...
Полный курс Java для разработчиков веб-сайтов и приложений
Полный курс Java для разработчиков веб-сайтов и приложений
Получите сертификат Java Web и Application Developer, используя наш курс.
8
2
6 560
5

Ответы 5

Вместо:

factory.getComparatorForClass(x.getClass()).compare(x, y)

вы можете просто реализовать Comparable и написать:

x.compareTo(y)

String, примитивные оболочки и стандартные коллекции уже реализуют Comparable.

Я не замечаю ничего подобного в голове. Если вам действительно нужно что-то подобное, реализовать это не составит большого труда.

Однако не могли бы вы уточнить, зачем вам это нужно? Обычно для классов не должно быть компаратора по умолчанию. Если класс имеет какой-то естественный порядок, вам действительно нужно, чтобы он реализовал java.lang.Comparable, а вместо этого реализовал Comparable#compareTo(Object) : int.

http://java.sun.com/j2se/1.4.2/docs/api/java/lang/Comparable.html

Используйте CompareToBuilder из Commons Lang.

Assists in implementing Comparable.compareTo(Object) methods.

To use this class write code as follows:

public class MyClass {
  String field1;
  int field2;
  boolean field3;

  ...

  public int compareTo(Object o) {
    MyClass myClass = (MyClass) o;
    return new CompareToBuilder()
      .appendSuper(super.compareTo(o)
      .append(this.field1, myClass.field1)
      .append(this.field2, myClass.field2)
      .append(this.field3, myClass.field3)
      .toComparison();
  }
}

Компаратор должен быть расширен .. это основано на реализации многократно используемого кода .. в этом методе вы можете иметь настраиваемое сравнение данных .. реализация очень проста .. просто реализуйте интерфейс Comparator .. переопределите его метод compareto и поместите код сравнения ... и верните тот, который, по вашему мнению, больше с точки зрения значений ..

Компаратор по умолчанию не существует в Java. Однако, если вы кодируете, например, настроенный поисковик, который намеревается использовать компаратор, а не метод compareTo () производного типа класса Comparable, вы можете написать статический внутренний класс компаратора в качестве компаратора по умолчанию, просто реализуя compare (), вызвав метод compareTo ().

Пример:

class Searcher> { частный компаратор компаратора;

Searcher(Comparator<T> comparator) {
    this.comparator = comparator;
}

Searcher() {
    this(new DefaultComparator<T>());
}

int search(...) {
    ...
}

private static class DefaultComparator<E extends Comparable<E>> 
        implements Comparator<E> {
    public int compare(E o1, E o2) {
        return o1.compareTo(o2);
    }
}

Другие вопросы по теме