数组排序比较方法总是进行默认比较

问题描述:

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

输出:(不管我如何用逻辑玩耍,甚至评论吧)

17  6  Rooney 
16  5  Sam 
15  6  John 

可能是什么问题?

+0

你应该表现出给定的结果和通缉的结果,以及你所使用的逻辑。 – 2010-10-09 22:43:07

+1

您是否尝试在比较器方法中使用断点或插入打印语句来查看发生了什么? – ide 2010-10-09 22:44:32

+3

向我们展示您真正使用的代码。而不是'Array.Sort',排序方法的正确名称是'Arrays.sort'。你在这个语句的最后还缺少一个分号。你也许应该让'StudentComparator'实现'Comparator '。这使您的代码更容易。并且不要在比较器中做任何随机事情。这是'Comparator.compare'方法的规范所禁止的。详细信息请阅读文档。 – 2010-10-09 22:48:51

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

+0

我的问题是,即使当我改变逻辑输出保持不变。如果(Student1.age> student2.age) { }返回-1,那么我的逻辑意思是假设我做了类似 的事情; } else if(Student1.age Student2.height) 返回-1; 否则如果(Student1.height 2010-10-09 23:00:01

+0

@Eternal学习,做你重新编译?你确定你正在使用你的代码的最后一个版本吗? – 2010-10-09 23:00:52

+0

是啊,我也重新编译我的代码 - 而我得到的结果相同每次我改变逻辑 – 2010-10-09 23:03:54

您的学生订购正确。你刚刚得到的订单方向错了。

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[])。

你可以试试这个:

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