Метод Array Sort Comparator всегда выполняет сравнение по умолчанию - PullRequest
1 голос
/ 10 октября 2010

У меня есть ученик класса - int age, int height и Name;

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

У меня есть класс

class StudentComparator implements Comparator{

 public int compare(Object 1, Object2)
 {
    // Logic
 }

}

У меня есть основной класс

class StudentSorter {

  // Initialise student objects etc
  // Have an array of students: students[]              
    Array.Sort(students,new StudentComparator() )

   // print values

}

Проблема, с которой я сталкиваюсь, заключается в том, что Output не похож на логику, которую я использую в методе сравнения класса StudentComparator. Логика есть:

  if(Student1.age > student2.age)
    {
               return 1; 
    }    
    else if(Student1.age < student2.age)
    {
              return -1;
    }
     else 
     {
        if(Student1.height > Student2.height)
                    return 1; 
        else if(Student1.height < Student2.height)
                return -1;
             else 
                return 0;


      }

Ввод: 15 6 Джон 16 5 Сэм 17 6 Руни

вывод: (независимо от того, как я играюсь с логикой или даже комментирую ее)

17        6       Rooney 
16        5       Sam
15        6       John

В чем может быть проблема?

Ответы [ 3 ]

2 голосов
/ 26 марта 2011

Вы можете попробовать это:

public int compare(Student s1, Student s2) 
{
    return s1.age == s2.age ? s1.height - s2.height : s1.age - s2.age;
}
1 голос
/ 10 октября 2010

Ваши ученики упорядочены правильно.Вы только что неправильно указали направление заказа.

package so3898183;

import java.util.Comparator;

public class StudentComparator implements Comparator<Student> {

  @Override
  public int compare(Student student1, Student student2) {
    if (student1.age < student2.age)
      return -1; // if the first student is "smaller", return something small
    if (student1.age > student2.age)
      return 1; // if the first student is "larger", return something large

    if (student1.height < student2.height)
      return -1;
    if (student1.height > student2.height)
      return 1;

    return 0;
  }

}

Некоторые замечания к другим решениям:

  • Не используйте «хитрость» вычитания student1.age - student2.age и изучите знакрезультата.Это приведет к переполнению больших чисел и может привести к неверным результатам.
  • Сохраняйте код максимально простым и читабельным.
  • Не выделяйте дополнительные объекты (например, int[], предложенный в другомответ), когда вам не нужно.
0 голосов
/ 10 октября 2010

Если первое значение - это возраст, то, как вы отсортировали по возрасту, вывод нормальный.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...