我有两个类 - Task(实现 Comparable)和 DeadlinedTask(其中 DeadlinedTask 扩展了 Task)。对于它们中的每一个,我都编写了一个重载的 compareTo 函数(每个函数都有 compareTo(Task) 和 compareTo(DeadlinedTask))。
我的想法是,我可以按类别对普通任务进行排序,按截止日期对 DeadlinedTasks 进行排序,但我还希望所有 DeadlinedTasks 都排在任务之上。
当我在只有任务(没有 DeadlinedTasks)的列表上调用 Collections.sort(myListOfTasks) 时,一切都非常有效。 但是,当我同时拥有 Tasks 和 DeadlinedTasks 的列表时,对象会更改顺序,但它们并未完全排序。
我曾尝试在类间比较中返回 1 以外的数字(1、1000、1000000 都做了同样的事情)。有什么方法可以通过 compareTo 和 Collections.sort 做到这一点,我可以使用不同的 java 功能,还是我必须编写自己的搜索函数(作为比较器?)?
任务比较方法:
public int compareTo(Task other){
if(this.GetCategory().compareTo(other.GetCategory())==0)
return this.GetName().compareTo(other.GetName());
else
return this.GetCategory().compareTo(other.GetCategory());
}
public int compareTo(DeadlinedTask other){
return 1;
}
DeadlinedTask compareTo 方法:
public int compareTo(Task other){
return -1;
}
public int compareTo(DeadlinedTask other){
if(this.GetDeadline().compareTo(other.GetDeadline())==0)
return this.GetName().compareTo(other.GetName());
else
return this.GetDeadline().compareTo(other.GetDeadline());
}
感谢您的帮助
最佳答案
... or do I have to write my own search function (as a Comparator?)?
是的。我认为这是最好的方法。
处理equals
和compareTo
的正常方法是返回false
(对于equals
)或抛出ClassCastException
(对于 compareTo
)如果参数的实际类型与 this
的实际类型不匹配。
如果您尝试为子类型实现equals
或compareTo
,您可以轻松创建语义异常,例如:
a.equals(b)
和b.equals(a)
返回不同的值,或者a.compareTo(b)
和b.compareTo(a)
返回不一致的值。
避免这些异常需要让父类(super class)型知道子类型。从设计的角度来看,这很糟糕,因为它限制了您将来创建更多子类型的能力。
对于您需要实现对两个或多个不同类的实例进行排序的规则的用例,Comparator
是最佳解决方案。
关于java - 如何比较 Java 中的类和继承类,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4983646/