【问题标题】:Comparator best practice when items cannot be logically compared无法对项目进行逻辑比较时的比较器最佳实践
【发布时间】:2016-05-21 16:52:58
【问题描述】:

首先这是一个学术问题,所以我们不要担心实践是否好。 假设我们有一个TreeSet<"Object">,我们想用一个比较器来实例化它。此比较器将返回通常的 0、-1 和 1,但前提是这两个对象是同一类。那么当对象属于不同的类并且比较它们没有意义时,比较器应该返回什么? -1 还是 1?或者,如果我不想抛出运行时异常,比较器的合同是否要求我必须在所有情况下都指定一个顺序?

【问题讨论】:

    标签: java comparator


    【解决方案1】:

    Comparator 必须指定它可能接收的所有可能值之间的排序。你不能有两个对象,它们可能是你的数据结构的一部分,Comparator 不能“处理”。如果比较它们没有意义,那就随意做出决定。例如,如果它们不属于同一类,只需比较类名:

    if (!a.getClass().equals(b.getClass()) {
        return a.getClass().getName().compare(b.getClass().getName());
    }
    

    【讨论】:

    • 所以我想合同是如果我要创建一个比较器,如果我不想抛出异常,我必须为所有可能的输入指定一个顺序。
    • @FaiLau 是的,并且排序需要保持一致。即,对于每个ab,如果a.compareTo(b) < 0 必须暗示b.compareTo(a) > 0,如果a.compareTo(b) = 0,则必须暗示b.compareTo(a) = 0
    猜你喜欢
    • 2012-09-25
    • 1970-01-01
    • 2017-06-20
    • 1970-01-01
    • 1970-01-01
    • 2020-02-21
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多