Java реализовать сравнение двух элементов
Я пытаюсь переопределить сопоставимое таким образом:
public int compareTo(Object other) {
if(other.getlength() > this.getlength()){
return 1;
} else if (other.getlength() < this.getlength()){
return -1;
} else {
if (other.getVal() > this.getVal()){
return 1;
} else {
return -1;
}
}
}
Я хочу, чтобы сначала список был отсортирован по длине, а затем, если длина одинакова, я хочу, чтобы те же самые удлиненные элементы были отсортированы (на месте) по их значениям. Но моя реализация работает неправильно. Кто-нибудь видит, что я делаю не так?
Мои результаты таковы:
a b = 3
a b c = 1
a b c = 1
a b = 2
a b = 1
Я хочу получить следующие результаты:
a b c = 1
a b c = 1
a b = 3
a b = 2
a b = 1
2 ответа:
Избежать логике, где это возможно. Серьезно - там, где это возможно, используйте арифметику, чтобы избежать if / else. It имеет тенденцию быть более надежным. В этом случае:
public int compareTo(Object o) { int ret = other.getlength() - this.getlength(); if ( ret == 0 ) { ret = other.getVal() - this.getVal(); } return ret; }
из ваших замечаний не ясно, будет ли список уже отсортирован или нет. Но вы можете справиться с этим, отсортировав список после сравнения его длин. Но то, что вы, очевидно, делаете неправильно, - это объект.метод GetValue()...это не имеет смысла, вы должны перебирать оба списка и сравнивать значения, чтобы сделать вывод, если они равны.Это не было очевидно без примера извините за комментарии выше, это не возможно иметь этот результат с вашим компаратором. Ваша логика по-моему, все правильно. Но было бы неплохо включить комментарии w00t также в противном случае вы будете иметь ab и может привести к ошибке во время выполнения. Пожалуйста, проверьте, правильно ли применен компаратор к вашей сортировочной функции (объектам).