Кто-нибудь знает какую-то фабрику компараторов на Java с
public Comparator getComparatorForClass(Class clazz) {}
Он вернет компараторы для таких вещей, как String, Double, Integer, но будет иметь
public void addComparatorForClass(Class clazz, Comparator comparator) {}
Для произвольных типов.
Что бы он сделал для классов, у которых более одного компаратора? Например, Сотрудник, которого можно отсортировать по имени или идентификатору?




Вместо:
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);
}
}
Использование Comparable - хороший вариант. Такой завод вообще не имеет смысла.