Java Comparator将大学生的学生ID从最低编号到最高编号进行排序

时间:2015-03-31 06:29:59

标签: java sorting comparator

这是我的代码,请不要给我分配的解决方案。任何人都可以在编译错误上启发我吗?为什么它不起作用。我之前写了这样的代码......

简单代码:

Student.java

public class Student 
{
    private int id;

    public Student(int NewId)
    {
        id = NewId;
    }
    public int getId(){ return id; }
    public void setId(int NewId){ id = NewId; }
}

Sort.java

public class Sort
{
    public static Comparator<Student> getStudentIdComparator()
    {
        return new IdComparator();//<- compile error
    }

    class IdComparator implements Comparator<Student>
    {
        @Override
        public int compare(Student o1, Student o2) 
        {
            return o1.getId() - o2.getId();
        }
    }
}

MainFile.java

class MainFile
{
    public static void main(String[] args)
    {
        Student s[] = new Student[10];
        // Here you would just create the instance variable with student id in                 the argument 
        Comparator<Student> studentIdComparator = Sort.getStudentIdComparator();

        Arrays.sort(students, studentIdComparator);
     }
}

3 个答案:

答案 0 :(得分:3)

您正尝试从静态类中访问非静态类。

只需在比较器类定义之前添加static关键字,如:

static class IdComparator implements Comparator<Student>

或使用Sort的实例:

new Sort().new IdComparator();

同时避免使用return o1.getId() - o2.getId();,因为它可能会导致下溢。使用

return Integer.compare(o1.getId(), o2.getId());

答案 1 :(得分:0)

您已将IdComparator作为内部课程

public class Sort{

    class IdComparator implements Comparator<Student> {
    ...
    }
...
}

由于您没有将static放在IdComparator上,这意味着IdComparator 的每个实例都属于某个<{1}的实例 }。 Sort实例将具有隐藏引用,该引用引用包含它的IdComparator对象。因此,您只能以指定Sort对象的方式使用new IdComparator来包含它。如果Sortx,您可以说

Sort

或者如果您使用x.new IdComparator() 非静态方法,并且您说

Sort

由于该方法是非静态的,因此它将在特定的new IdComparator() 对象上运行,Sort使用与包含新new的对象相同的对象。< / p>

但是,由于您是在静态方法中调用它,因此没有IdComparator对象来包含它。这就是你收到错误的原因。

您可能不希望Sort个对象属于特定的IdComparator个对象,因为您不需要引用任何Sort个实例字段。将Sort添加到static的声明中会使其成为嵌套类,而不是内部类。

IdComparator

答案 2 :(得分:0)

因为您的IdComparator类是一个动态内部类,就像您实例的普通字段一样,但是您的main方法是静态的,您不能使用静态方法直接调用内部类实例。