Array Sort Comparator方法始终执行默认比较

时间:2010-10-09 22:41:31

标签: java sorting

我有一个班级学生 - 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约翰     16 5山姆     17 6鲁尼

输出:(无论我如何玩逻辑甚至评论它)         

17        6       Rooney 
16        5       Sam
15        6       John

可能是什么问题?

3 个答案:

答案 0 :(得分:2)

你可以试试这个:

public int compare(Student s1, Student s2) 
{
    return s1.age == s2.age ? s1.height - s2.height : s1.age - s2.age;
}

答案 1 :(得分: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 :(得分:0)

如果第一个值是年龄,则按年龄排序,输出正常。