加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 编程开发 > Java > 正文

java – 部分有序比较器

发布时间:2020-12-14 17:48:00 所属栏目:Java 来源:网络整理
导读:如何实现根据部分顺序关系对其元素进行排序的 java.util.Comparator? 例如给定部分顺序关系a?c,b?c; a和b的顺序是未定义的. 由于比较器需要一个完整的排序,所以执行部分??排序的元素是任意的但是一致的. 以下工作? interface Item { boolean before(Item o
如何实现根据部分顺序关系对其元素进行排序的 java.util.Comparator?

例如给定部分顺序关系a?c,b?c; a和b的顺序是未定义的.

由于比较器需要一个完整的排序,所以执行部分??排序的元素是任意的但是一致的.

以下工作?

interface Item {
    boolean before(Item other);
}

class ItemPartialOrderComperator implements Comparator<Item> {
    @Override
    public int compare(Item o1,Item o2) {
        if(o1.equals(o2)) {  // Comparator returns 0 if and only if o1 and o2 are equal;
            return 0;
        }
        if(o1.before(o2)) {
            return -1;
        }
        if(o2.before(o1)) {
            return +1;
        }
        return o1.hashCode() - o2.hashCode(); // Arbitrary order on hashcode
    }
}

这个比较器的订购是否传递?
(我担心这不是)
比较器是否需要传递?
(当在TreeMap中使用时)
>如何正确实现?
(如果上面的实现不起作用)
(Hashcodes可能会冲突,为了简化冲突,示例忽略冲突;有关哈希码的故障安全排序,请参阅Damien B’s answer至Impose a total ordering on all instances of *any* class in Java).

解决方法

问题在于,当您具有无与伦比的元素时,您需要比比较哈希码更清晰.例如,给定部分阶{a< b,c < d},哈希码可以满足h(d) h(b) h(c) h(a),这意味着,b < c < d < a(粗体表示由哈希代码断开的连接),这将导致TreeMap的问题. 一般来说,除了事先对钥匙进行拓扑分类外,您可能没有什么可做的,因此欢迎有关您感兴趣的部分订单的详细信息.

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读