java - 如何比较 Java 中的类和继承类

标签 java sorting compare

我有两个类 - 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?)?

是的。我认为这是最好的方法。

处理equalscompareTo 的正常方法是返回false(对于equals)或抛出ClassCastException(对于 compareTo)如果参数的实际类型与 this 的实际类型不匹配。

如果您尝试为子类型实现equalscompareTo,您可以轻松创建语义异常,例如:

  • a.equals(b)b.equals(a) 返回不同的值,或者
  • a.compareTo(b)b.compareTo(a) 返回不一致的值。

避免这些异常需要让父类(super class)型知道子类型。从设计的角度来看,这很糟糕,因为它限制了您将来创建更多子类型的能力。

对于您需要实现对两个或多个不同类的实例进行排序的规则的用例,Comparator 是最佳解决方案。

关于java - 如何比较 Java 中的类和继承类,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4983646/

相关文章:

Java:右键单击文本字段上的复制剪切粘贴

c - C:如何按频率编号和字母顺序从可变数量的文件中对单词进行排序

Ruby - 基于 1 个键比较/合并 2 个哈希数组

java - 从内存编译 java 类失败,并且在 cmd 和 netbean ide 中输出两个不同的错误

java - 如何指定要包含在子字符串中的字母数(而不是空格)?

algorithm - 通过创建单个值按两个整数字段(一个 desc 和一个 asc)排序

Mysql日期比较错误LIMIT 0,30

angular - 在 Angular 中比较自定义验证器中的值

java - 在 Java 中打印字符数组

algorithm - 堆排序算法