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 2

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 и может привести к ошибке во время выполнения. Пожалуйста, проверьте, правильно ли применен компаратор к вашей сортировочной функции (объектам).