【问题标题】:Java Comparator to sort the student ids of college student from lowest number to highestJava比较器将大学生的学生ID从最低数字到最高排序
【发布时间】:2015-03-31 06:29:58
【问题描述】:

这是我的代码,请不要给我作业的解决方案。谁能告诉我编译错误?以及为什么它不起作用。我以前写过这样的代码……

简单代码:

学生.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; }
}

排序.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);
     }
}

【问题讨论】:

  • 错误信息到底是什么?
  • 线程“main”java.lang.Error 中的异常:未解决的编译问题:无法访问 Sorter 类型的封闭实例。必须使用 Sorter 类型的封闭实例来限定分配(例如 x.new A(),其中 x 是 Sorter 的实例)。在 Sorter.getStudentIdComparator(Sorter.java:17) 在 Tester.main(Tester.java:21)

标签: java sorting comparator


【解决方案1】:

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

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

static class IdComparator implements Comparator<Student>

或使用类似排序的实例:

new Sort().new IdComparator();

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

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

【讨论】:

  • 什么是静态的,它在这种情况下有什么作用?
  • 加一个关于下溢的建议。 (如果 ID 从不为负,则不会发生这种情况,但您的建议仍然是一种很好的做法。)
【解决方案2】:

您已将IdComparator 设为内部类

public class Sort{

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

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

x.new IdComparator()

或者如果你在Sort非静态方法中,你说

new IdComparator()

由于该方法是非静态的,它将对特定的Sort 对象进行操作,并且new 使用与包含新IdComparator 的对象相同的对象。

但由于您在 static 方法中调用它,因此没有 Sort 对象来包含它。这就是你出错的原因。

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

public class Sort{

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

【讨论】:

    【解决方案3】:

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2021-09-20
      • 1970-01-01
      • 2016-09-19
      • 2019-03-01
      • 1970-01-01
      • 2016-08-04
      • 1970-01-01
      • 2016-07-03
      相关资源
      最近更新 更多