Как реализовать java.util.Comparator
, который упорядочивает свои элементы в соответствии с отношением частичного заказа?
Например, если задано отношение частичного порядка a ≺ c, b ≺ c; порядок a и b равен undefined.
Поскольку Comparator
требует полного упорядочения, элементы ордеров реализации, для которых частичное упорядочение undefined произвольно, но последовательно.
Будет ли следующая работа?
interface Item {
boolean before(Item other);
}
class ItemPartialOrderComperator implements Comparator<Item> {
@Override
public int compare(Item o1, Item o2) {
if(o1.equals(o2)) { // Comparator returns 0 if and only if o1 and o2 are equal;
return 0;
}
if(o1.before(o2)) {
return -1;
}
if(o2.before(o1)) {
return +1;
}
return o1.hashCode() - o2.hashCode(); // Arbitrary order on hashcode
}
}
- Является ли этот компаратор упорядочивающим транзитивным?
(Я боюсь, что это не так) - Требуется ли
Comparators
быть транзитивным?
(при использовании вTreeMap
) - Как правильно его реализовать?
(если реализация выше не работает)
(Hashcodes могут столкнуться, для простоты столкновений пример игнорирует столкновения, см. Ответ Damien B на Наложение полного заказа на все экземпляры * любой * класс в Java для отказоустойчивого упорядочения на хэш-кодах.)