public static Comparator<Container> DEPARTURE = new Comparator<Container>() {
@Override
public int compare(Container container1, Container container2) {
if (container1.departure.time.isBefore(container2.departure.time))
return -1;
else if (container1.departure.time.equals(container2.departure.time) &&
container1.departure.maxDuration == container2.departure.maxDuration &&
container1.departure.transportCompany.equals(container2.departure.transportCompany) &&
container1.departure.transportType == container2.departure.transportType)
return 0;
else
return +1;
}
};
переменная вылета просто экземпляр объекта, содержащий следующие поля:Почему мой метод сравнения нарушает общий контракт?
public DateTime time;
public int maxDuration;
public TransportType transportType;
public String transportCompany;
P.S. объект времени является экземпляром DateTime из библиотеки Joda-Time, а TransportType - это перечисление, содержащее константы Train, Seaship, Barge и Truck.
EDIT:
Ok, поэтому я отредактировал мой компаратор на следующее:
public static Comparator<Container> DEPARTURE = new Comparator<Container>() {
@Override
public int compare(Container container1, Container container2) {
if (container1.departure.time.isBefore(container2.departure.time))
return -1;
else if (container1.departure.time.isBefore(container2.departure.time))
return +1;
else {
if (container1.departure.maxDuration == container2.departure.maxDuration && container1.departure.transportType == container2.departure.transportType && container1.departure.transportCompany.equals(container2.departure.transportCompany))
return 0;
else
return +1;
}
}
};
, но это, очевидно, нарушает общий договор. Как я могу сделать это так, чтобы сортировать по времени, а затем сортировать те объекты, которые имеют эквивалентное время по их другим атрибутам, только заботясь, равны они или нет? Надеюсь, что это имеет смысл ...
EDIT: РЕШЕНИЕ
Спасибо всем за ответ на мой вопрос! Изучив ваши комментарии, я придумал следующее решение, которое, похоже, работает (не тщательно протестировано):
Я фактически переместил часть сравнения в отставку своего класса, потому что мне также нужно сравнить по прибытии. Я решил просто сортировать по всем признакам (последовательно время, maxDuration, transportCompany и transportType) и решение, которое я придумал это:
public static Comparator<Container> ARRIVAL = new Comparator<Container>() {
@Override
public int compare(Container container1, Container container2) {
return container1.arrival.compareTo(container2.arrival);
}
};
public static Comparator<Container> DEPARTURE = new Comparator<Container>() {
@Override
public int compare(Container container1, Container container2) {
return container1.departure.compareTo(container2.departure);
}
};
, а затем метод CompareTo:
@Override
public int compareTo(LocationMovement lm) {
if (this.time.isBefore(lm.time))
return -1;
else if (this.time.isAfter(lm.time))
return +1;
else {
int c = this.maxDuration - lm.maxDuration;
if (c != 0) return c;
c = this.transportCompany.compareTo(lm.transportCompany);
if (c != 0) return c;
c = this.transportType.ordinal() - lm.transportType.ordinal();
return c;
}
}
Если контейнер 'c1' и контейнер' c2' имеют тот же 'departure.time', но различаются по другим признакам, то оба' сравнить (c1, c2) и 'сравнения (c2, c1) 'будет возвращать' + 1'. –
Sidenote: Имея такую огромную чудовищную оценку в 'else if', просто спрашивает о проблемах. –
Спасибо, ребята, за ответ. Не могли бы вы взглянуть на мое редактирование, пожалуйста? – Yaeger