Как использовать Comparable CompareTo для строк в Java - PullRequest
21 голосов
/ 20 сентября 2010

Я могу использовать его для сортировки по emp id, но я не уверен, что можно сравнивать строки. Я получаю сообщение об ошибке: оператор не определен для строк.

public int compareTo(Emp i) {
            if (this.getName() == ((Emp ) i).getName())
                return 0;
            else if ((this.getName()) > ((Emp ) i).getName())
                return 1;
            else
                return -1;

Ответы [ 5 ]

45 голосов
/ 20 сентября 2010

Вам нужно использовать метод compareTo() для Strings.

return this.getName().compareTo(i.getName());

Это должно делать то, что вы хотите.

Обычно при реализации интерфейса Comparable вы просто агрегируете результаты использования других Comparable членов класса.

Ниже приведена довольно типичная реализация метода compareTo():

class Car implements Comparable<Car> {
    int year;
    String make, model;
    public int compareTo(Car other) {
        if (!this.make.equalsIgnoreCase(other.make))
            return this.make.compareTo(other.make);
        if (!this.model.equalsIgnoreCase(other.model))
            return this.model.compareTo(other.model);
        return this.year - other.year;
    }
}
7 голосов
/ 20 сентября 2010

Уверен, ваш код может быть написан так:

public int compareTo(Emp other)
{
    return this.getName().compareTo(other.getName());
}
4 голосов
/ 20 сентября 2010

Java Строка уже реализует Comparable. Таким образом, вы можете просто написать свой метод как

public int compareTo(Emp emp) {
   return this.getName().compareTo(emp.getName());
}

(конечно, убедитесь, что вы добавили правильные проверки, такие как нулевые проверки и т. Д.)

Также в вашем коде не пытайтесь сравнивать строки, используя '=='. Вместо этого используйте метод «равно». '==' сравнивает только строковые ссылки, в то время как равно семантически сравнивает две строки.

3 голосов
/ 20 сентября 2010

Вам не нужно разыгрывать i в Emp, это уже Emp:

public int compareTo(Emp i) {
    return getName().compareTo(i.getName());
}
1 голос
/ 20 сентября 2010

В случае, если не

if (this.getName() == ((Emp ) i).getName())

be

if (this.getName().equals(i.getName()))

...