Java Comparator将大学生的学生ID从最低数字排序到最高数字
这是我的密码,请不要给我作业的答案。有人能告诉我编译错误吗?以及为什么它不起作用。我以前写过这样的代码 简单代码: Student.javaJava Comparator将大学生的学生ID从最低数字排序到最高数字,java,sorting,comparator,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){ i
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();
}
}
}
公共类排序
{
公共静态比较程序getStudentComparator()
{
返回新的IdComparator();//您正试图从静态类中访问非静态类
只需在比较器类定义之前添加static关键字,如:
static class IdComparator implements Comparator<Student>
同时避免使用返回o1.getId()-o2.getId();
,因为这可能会导致下溢。使用
return Integer.compare(o1.getId(), o2.getId());
您已经使IdComparator
成为一个内部类
或者如果您使用的是排序的非静态方法,您会说
new IdComparator()
由于该方法是非静态的,因此它将在特定的排序
对象上操作,新的
使用与包含新的IdComparator
的对象相同的对象
但是,由于您在静态方法中调用了它,因此没有排序对象来包含它。这就是为什么会出现错误
您可能不希望IdComparator
对象属于特定的Sort
对象,因为您不需要引用任何Sort
实例字段。将static
添加到IdComparator
的声明中会使其成为嵌套类,而不是内部类
公共类排序{
静态类IdComparator实现Comparator{
...
}
...
}
因为IdComparator类是一个动态的内部类,就像实例的普通字段一样,但main方法是静态的,所以不能使用静态方法直接调用内部类实例。错误消息是什么?线程“main”中的异常java.lang.Error:未解决的编译问题:无法访问类型Sorter的封闭实例。必须使用类型Sorter的封闭实例(例如x.new A(),其中x是Sorter的实例)来限定分配。位于Sorter.getStudentComparator(Sorter.java:17)位于Tester.main(Tester.java:21)到底什么是静态的,它在这个上下文中做了什么?另外一个是关于下溢的建议(如果ID从来都不是负数,就不会发生这种情况,但是您的建议是良好的实践)
return Integer.compare(o1.getId(), o2.getId());
public class Sort{
class IdComparator implements Comparator<Student> {
...
}
...
}
x.new IdComparator()
new IdComparator()
public class Sort{
static class IdComparator implements Comparator<Student> {
...
}
...
}