3 回答
TA贡献1851条经验 获得超4个赞
您有两个不同的 compareTo() 方法。Collections.sort() 不会调用您期望使用的那个。
如果您想使用 Collections.sort() 对学生进行排序,那么您需要一个带有签名的方法 compareTo(Student student);
此方法与 compareTo(Person person) “重叠”,这是两个方面的问题:
从语义上讲,Person 级别的 compareTo() 方法建立了语义,而 Student 级别的 compareTo() 方法偏离了这些语义,这绝不是一个好主意。
从技术上讲,您依赖于与方法绑定相关的实现细节来使您的系统按预期运行。这充其量是狡猾的。
我会寻找一种使用显式用户提供的比较器而不是依赖于内部 compareTo() 的排序方法的排序方法。
TA贡献1794条经验 获得超7个赞
问题
您没有定义
Person
应该如何比较对象。您错误地定义了如何比较
Student
和Professor
实例。您编写
compareTo(String)
了具有误导性的重载方法。
解决方案
Person#compareTo正确定义,删除其compareTo(String):
public int compareTo(Person p) {
return getName().compareTo(p.getName());
}
定义Student#compareTo并Professor#compareTo正确删除它们的compareTo(String). 这是一个如何Student#compareTo编写的示例:
@Override
public int compareTo(Person t) {
final int personComparisonResult = super.compareTo(t);
if (personComparisonResult == 0) {
return program.compareTo(((Student) t).program);
}
return personComparisonResult;
}
它说“首先将它们作为Persons进行比较;如果它们相等(此处为同名),则将它们作为Students进行比较(此处为学生的程序)”。
我会删除这些方法。对于不适合类域的简单代码行使用单独的方法是不值得的。
TA贡献1765条经验 获得超5个赞
如果要使用与类“自然”排序不同的排序对对象进行排序,则应该使用Arrays.sort(T[], Comparator<T>)
, 和一个Comparator
实现特定排序顺序的对象。
该javadoc的用于Comparable
解释说,它应该实现的语义。(仔细阅读它们!)
关于自然排序:
Person[]
由compareTo(Person)
方法给出的遗嘱的“自然”排序。a
Student[]
(或ArrayList<Student>
)的“自然”排序将由该compareTo(Student)
方法给出。等等。
在这些情况下都
compareTo(String)
不会使用您的方法!
添加回答
举报