2012-04-04 4 views
27

Я работаю над домашним заданием и нуждаюсь в том, чтобы кто-то меня пропустил. Я узнаю о массивах, и в основном у меня есть массив, который собирает имя, имя и оценку. Мне нужно написать метод compareTo, который будет сравнивать фамилию, а затем первое имя, чтобы список можно сортировать в алфавитном порядке, начиная с последних имен, а затем, если у двух людей есть одно и то же имя, он сортирует имя.compareTo method java

Я смущен, потому что вся информация в моей книге сравнивает числа, а не объекты, или я думаю, что строки? Я думаю, что струны считаются объектами при работе с массивами. Это действительно сбивает меня с толку, поэтому, если кто-то сможет пройти через меня, я буду признателен. Вот что я закодировал до сих пор, но я знаю, что это неправильно, но по крайней мере объясняет, что я думаю, что я делаю.

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

+0

Если вы могли бы просто сказать 'someString cHao

ответ

23

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

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; 
+0

Я согласен с тем, как вы структурируете оператор if. Первое - это ошибки. – LatheElHafy

1

if (s.compareTo(t) > 0) будет сравнивать строки s для строки и т возвращает значение 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());  
    } 

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

Cheers

1

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

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

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

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

+0

Итак, вы говорите, что мне не нужен код, начинающийся с if (studentcompare! = 0), потому что строка выше, которая уже возвращает положительные и отрицательные числа? –

0

String - это объект на Java.

вы могли бы сравнить, как это так,

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

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

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

18

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

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

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

class Jedi implements Comparable<Jedi> { 

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

Тогда, если наш джедай старше предоставленному один, вы должны вернуть положительный, если они того же возраста, вы return 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 для сортировки объектов по одному.

+0

Чтобы добавить, вы можете выбрать, отображать ли заказ список по возрастанию или убыванию, переставляя позиции -1, 1 в качестве возвращаемых значений – fardown

0

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

Что касается пояснения, то «результат == 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; 
} 
2

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

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

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()) проверяет lastnames является ли то же или нет this.lastName.compareTo(s.getLastName()) если да, то возвращает сравнение фамилии. this.firstName.compareTo(s.getFirstName()) если нет, возвращает сравнение имени.