java – 部分有序比较器

前端之家收集整理的这篇文章主要介绍了java – 部分有序比较器前端之家小编觉得挺不错的,现在分享给大家,也给大家做个参考。
如何实现根据部分顺序关系对其元素进行排序的 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 answerImpose 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的问题. 一般来说,除了事先对钥匙进行拓扑分类外,您可能没有什么可做的,因此欢迎有关您感兴趣的部分订单的详细信息.

猜你在找的Java相关文章