2010-10-09 4 views
1

У меня есть ученик класса - 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 

} 

Проблема я столкнулся в том, что выход не похожа на логику я имею в методе сравнения класса 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 John 16 5 Сэм 17 6 ​​Руни

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

17  6  Rooney 
16  5  Sam 
15  6  John 

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

+0

Вы должны показать данный результат и желаемого результата, а также логику вы использовали. –

+1

Вы пытались использовать контрольные точки или вставлять утверждения печати в свой метод компаратора, чтобы узнать, что происходит? – ide

+3

Покажите нам код, который вы действительно используете. Вместо 'Array.Sort' правильное имя метода сортировки -' Arrays.sort'. Вам также не хватает точки с запятой в конце этого утверждения. И вы должны, вероятно, позволить 'StudentComparator' реализовать' Comparator '. Это упрощает ваш код. И никогда не делайте случайных вещей в компараторе. Это запрещено спецификацией метода «Comparator.compare». Подробнее читайте в документации. –

ответ

0

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

+0

Моя проблема в том, что даже когда я меняю логику, выход остается таким же. Я подразумеваю, что я делаю что-то вроде if (Student1.age> student2.age) { return -1; } else if (Student1.age Student2.height) return -1; else if (Student1.height

+0

@Eternal Learner, сделал вашу перекомпиляцию? Вы уверены, что используете последнюю версию своего кода? –

+0

Да, я перекомпилировал свой код - и получаю тот же вывод каждый раз, когда меняю логику –

1

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

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[], предложенные в другом ответе), когда вам не нужно.
2

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

public int compare(Student s1, Student s2) 
{ 
    return s1.age == s2.age ? s1.height - s2.height : s1.age - s2.age; 
} 
Смежные вопросы