Как написать метод compareTo, который сравнивает объекты?

Я изучаю массивы, и в основном у меня есть массив, который собирает фамилию, имя и оценку.

мне нужно написать compareTo метод, который будет сравнивать фамилию, а затем имя, чтобы список мог быть отсортирован в алфавитном порядке, начиная с фамилий, а затем, если два человека имеют одинаковую фамилию, то он будет сортировать имя.

Я в замешательстве, потому что вся информация в моей книге сравнивает цифры, а не объекты и Веревка.

вот что я закодировал до сих пор. Я знаю, что это неправильно, но это, по крайней мере, объясняет, что я думаю, что делаю:

public int compare(Object obj) // creating a method to compare 
{   
    Student s = (Student) obj; // creating a student object

    // I guess here I'm telling it to compare the last names?
    int studentCompare = this.lastName.compareTo(s.getLastName()); 

    if (studentCompare != 0)
        return studentCompare;
    else 
    {
        if (this.getLastName() < s.getLastName())
            return - 1;

        if (this.getLastName() > s.getLastName())
            return 1;
    }
    return 0;
}

Я знаю < и > символы неверны, но, как я уже сказал, Моя книга показывает только, как использовать compareTo.

9 ответов


это правильный способ сравнения строк:

int studentCompare = this.lastName.compareTo(s.getLastName()); 

это даже не компиляция:

if (this.getLastName() < s.getLastName())

использовать .

Итак, чтобы сравнить кулак / фамилию, вам нужно:

int d = getFirstName().compareTo(s.getFirstName());
if (d == 0)
    d = getLastName().compareTo(s.getLastName());
return d;

метод compareTo описывается следующим образом:

сравнивает этот объект с указанным объектом для заказа. Возвращает отрицательное целое число, ноль или положительное целое число, так как этот объект меньше чем, равно или больше указанного объекта.

допустим, мы хотели бы сравнить джедаев по их возрасту:

class Jedi implements Comparable<Jedi> {

    private final String name;
    private final int age;
        //...
}

тогда, если наши джедаи старше предоставленного, вы должны вернуть положительный результат, если они одного возраста, вы возвращаете 0, и если наш джедай моложе, вы возвращаете отрицательный результат.

public int compareTo(Jedi jedi){
    return this.age > jedi.age ? 1 : this.age < jedi.age ? -1 : 0;
}

реализация compareTo метод (исходя из Comparable интерфейс) вы определяете, что называется естественный порядок. Все методы сортировки в JDK будут использовать этот порядок по умолчанию.

есть случаи, в которых вы можете основывать свое сравнение на других объектах, а не на примитивном типе. Например, джедаи копаре, основанные на их именах. В в этом случае, если сравниваемые объекты уже реализуют Comparable затем вы можете сделать сравнение, используя его compareTo метод.

public int compareTo(Jedi jedi){
    return this.name.compareTo(jedi.getName());
}

в этом случае было бы проще.

теперь, если вы inted использовать как имя и возраст в качестве критериев сравнения, то вы должны решить ваш oder сравнения, что имеет приоритет. Например, если два джедая названы одинаково, то вы можете использовать их возраст, чтобы решить, что идет первым, а что идет второй.

public int compareTo(Jedi jedi){
    int result = this.name.compareTo(jedi.getName());
    if(result == 0){
        result = this.age > jedi.age ? 1 : this.age < jedi.age ? -1 : 0;
    }
    return result;
}

если бы у вас был массив джедаев

Jedi[] jediAcademy = {new Jedi("Obiwan",80), new Jedi("Anakin", 30), ..}

все, что вам нужно сделать, это попросить класс java.util.Arrays использовать метод сортировки.

Arrays.sort(jediAcademy);

этой Arrays.sort метод будет использовать compareTo способ сортировки объектов по одному.


слушайте @milkplusvellocet, я бы рекомендовал вам реализовать сопоставимый интерфейс с вашим классом.

просто способствуя ответам других:

String.compareTo() расскажет вам, насколько отличается строка от другой.

например System.out.println( "Test".compareTo("Tesu") ); будет выведите -1 и System.out.println( "Test".compareTo("Tesa") ); напечатает 19

и ботан и geeky однострочное решение этой задачи было бы:

return this.lastName.equals(s.getLastName()) ? this.lastName.compareTo(s.getLastName()) : this.firstName.compareTo(s.getFirstName());

объяснение:

this.lastName.equals(s.getLastName()) проверяет ли lastnames такие же или нет this.lastName.compareTo(s.getLastName()) если да, то возвращает сравнение фамилию. this.firstName.compareTo(s.getFirstName()) если нет, возвращает сравнение имени.


вы почти полностью там.

ваши первые несколько строк, сравнивая фамилию, находятся на правильном пути. Метод compareTo () в string возвращает отрицательное число для строки в алфавитном порядке до и положительное число для одного в алфавитном порядке после.

теперь вам просто нужно сделать то же самое для вашего имени и оценки.

другими словами, если фамилия 1 == фамилия 2, перейдите на проверку вашего имени рядом. Если первое имя то же самое, проверьте ваш счет следующий. (Подумайте о вложенности блоков if/then.)


рассмотрите возможность использования Comparator интерфейс, описанный здесь который использует дженерики, так что вы можете избежать литья Object to Student.

как сказал Евгений Ретунский, ваша первая часть-правильный способ сравнения Strings. Также, если lastNames равны, я думаю, вы хотели сравнить firstNames, в этом случае просто использовать compareTo таким же образом.


if (s.compareTo(t) > 0) будет сравнивать строку s со строкой t и возвращать значение int, которое вы хотите.

    public int Compare(Object obj) // creating a method to compare {   
        Student s = (Student) obj; //creating a student object

        // compare last names
        return  this.lastName.compareTo(s.getLastName());    
    }

теперь просто проверьте положительный отрицательный возврат от метода, как обычно.

Ура


строка-это объект в Java.

вы можете сравнить так,

if(this.lastName.compareTo(s.getLastName() == 0)//last names are the same

У меня не было бы параметра типа объекта, нет смысла бросать его студенту, если мы знаем, что он всегда будет типом Student.

что касается объяснения, "result == 0" будет происходить только тогда, когда фамилии идентичны, в этот момент мы сравниваем имена и возвращаем это значение.

public int Compare(Object obj)
{       
    Student student = (Student) obj;
    int result = this.getLastName().compareTo( student.getLastName() );

    if ( result == 0 )
    {
        result = this.getFirstName().compareTo( student.getFirstName() );
    }

    return result;
}

Если вы используете compare to метод сопоставимого интерфейса в любом классе. Это можно использовать для упорядочения строки в лексикографическом формате.

public class Student() implements Comparable<Student>{

public int compareTo(Object obj){
if(this==obj){
    return 0;
}
if(obj!=null){
    String objName = ((Student)obj).getName();
    return this.name.comapreTo.(objName);
}
}