Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/sorting/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/asp.net-mvc-3/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 数组排序比较器方法始终执行默认比较_Java_Sorting - Fatal编程技术网

Java 数组排序比较器方法始终执行默认比较

Java 数组排序比较器方法始终执行默认比较,java,sorting,Java,Sorting,我有一个班的学生-智力的年龄,智力的身高和名字 我有n个学生类的对象,我试着先按年龄排序,如果是平手,然后按身高排序,如果是平手,则随机命名 我有一节课 class StudentComparator implements Comparator{ public int compare(Object 1, Object2) { // Logic } } 我有一节主课 class StudentSorter { // Initialise student objects e

我有一个班的学生-智力的年龄,智力的身高和名字

我有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类的comparator方法中的逻辑不相似。 逻辑是:

  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;


      }

可能有什么问题?

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

学生的顺序正确。你只是把订单的方向弄错了

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;
  }

}
包so3898183;
导入java.util.Comparator;
公共类StudentComparator实现了Comparator{
@凌驾
公共整数比较(学生1、学生2){
if(学生1.年龄<学生2.年龄)
return-1;//如果第一个学生“较小”,则返回较小的值
如果(学生1.年龄>学生2.年龄)
return 1;//如果第一个学生“较大”,则返回较大的值
if(学生1.身高<学生2.身高)
返回-1;
如果(学生1.身高>学生2.身高)
返回1;
返回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;
}

您应该显示给定的结果和想要的结果以及使用的逻辑。您是否尝试在比较器方法中使用断点或插入打印语句来查看发生了什么?向我们展示您真正使用的代码。排序方法的正确名称不是
Array.Sort
,而是
Arrays.Sort
。您在该语句末尾还缺少一个分号。您可能应该让
StudentComparator
实现
Comparator
。这使您的代码更容易。不要在比较器中做任何随机的事情。
比较器的规范禁止这种情况。compare
方法。详细阅读文档。我的问题是,即使我更改了逻辑,输出仍然保持不变。我的逻辑意思是,假设我做了一些类似if(Student1.age>student2.age){return-1;}else if(Student1.agestudent2.height)return-1;else if(Student1.heightif(true)在
compareTo
方法的最开始处返回0;
。这应该保持顺序不变。如果没有,请使用调试器逐步检查代码以查找问题。
public int compare(Student s1, Student s2) 
{
    return s1.age == s2.age ? s1.height - s2.height : s1.age - s2.age;
}