Подтвердить что ты не робот

Метод compareTo java

Я работаю над домашним заданием и нуждаюсь в том, чтобы кто-то меня пропустил. Я узнаю о массивах, и в основном у меня есть массив, который собирает имя, имя и оценку. Мне нужно написать метод 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, используя числа, которые, как я считаю, являются несправедливыми, чтобы ожидать, что я пойму, как сравнивать объекты.

4b9b3361

Ответ 1

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

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

Это даже не компилируется:

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

Использование  if (this.getLastName().compareTo(s.getLastName()) < 0).

Итак, для сравнения заказа кулака/фамилии вам нужно:

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

Ответ 2

Метод 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());
}

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

Теперь, если вы намерены использовать как имя, так и возраст в качестве критерия сравнения, тогда вам нужно решить, какой из сравнения, что имеет преимущество. Например, если два джедаи названы одинаковыми, то вы можете использовать их возраст, чтобы решить, что идет первым, а второе - вторым.

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;
}

Если у вас был массив Jedis

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

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

Arrays.sort(jediAcademy);

Этот метод Arrays.sort будет использовать ваш метод compareTo для сортировки объектов один за другим.

Ответ 3

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

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

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

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

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

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

Пояснение:

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

Ответ 4

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());    
    }

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

Приветствия

Ответ 5

Ты почти весь путь.

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

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

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

Ответ 6

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

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

Ответ 7

A String - это объект в Java.

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

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

Ответ 8

У меня не было бы параметра типа Object, нет смысла бросать его в Student, если мы знаем, что он всегда будет типом 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;
}