对Collection中的对象具有不同的equals(物理等于和逻辑等于)的机制

时间:2012-08-01 11:26:46

标签: java list collections equals comparator

是否有像Comparator这样的Equalator机制,所以我可以在复制列表中使用不同的等号?

编辑:我的目标是区分当前的list1.equals(list2),它检查它是浅拷贝还是带有所有对象的深拷贝a.equals(b)和list1.identical (list2)检查它是否只是带有未修改列表的浅层副本

所有这些清单都来自同一型号。有些是自己的副本,因此它们保存指向同一对象的指针,而其他则是深层副本,因此层次结构完全被复制,因为它们具有内容更新,而不仅仅是结构。

我经常发现自己是listl.equals(list2)但是我需要一种机制来判断两者是否都是TOTAL副本(同一个对象的集合相同)或者有时候它们是LOGICAL副本(通过我自己实现的逻辑等于) ,所以list会调用equals,而对象应该实现比a == b更多的东西。

我的问题是没有Equalator接口,如果我覆盖对象等于我松散了TOTAL EQUAL(a == b)

的比较能力

例如,这样会很好;

Collections.equal(l1,l2,new Equalator(){
    @Override public boolean equals(Obj1,Obj2){
          //Default lists comparison plus commparison of objects based on
          return (obj1.propertyX() == obj2.propertyX());
    }
});

并且我仍然可以执行list1.equals(list2),因此它们使用默认的equals(obj1 == obj2),只有当包含的对象完全相同时才会这样。

第一个操作对于检查列表(可能是模型中完全重新创建的对象的更新列表)是否仍等于旧列表非常有用。

第二个操作对于检查列表是否有用(它是旧版数据模型的浅层副本),它不包含任何超越的更改,因为它是udpdated版本时在代码中移动它。

编辑:一个很好的例子就是拥有一个Point(x,y)列表。我们应该能够知道两个列表是否相等,因为它们是完全相同的点集或相等,因为它们包含的点在逻辑方式上是相等的。如果我们可以将phyEqual和logEqual都实现为object,并且在任何对象中都有这两个方法,那么list.phyEqual(list2)或list1.logEqual(list2)

2 个答案:

答案 0 :(得分:2)

至少对我来说,你的问题并没有真正清楚地表达出来。如果这不能正确回答,你可以重新说一下吗?

在给定的Collection具体类型中,大多数等于实现已经完成了你提示的内容。 例如:

    public boolean equals(Object o) {
        if (o == this)
            return true;

在这种情况下,这样的事情可能有意义 您可以轻松覆盖此:

    @Override
    public boolean equals(Object o) {
        if (o.getPrimaryKey() == this.getPrimaryKey()) 
            return true;
        return super().equals(o);

[应添加空值测试] 如果要创建标准集合,甚至可以在构造期间匿名覆盖equals方法。

如果这不能达到您想要的效果,您可以自己扩展收藏集并覆盖其中的任何方法来执行类似的操作。

这有帮助吗?

答案 1 :(得分:2)

迟到的答案,但也许对某人有用......

Guava Equivalence类与Comparator的等效性相同,用于比较。您需要编写自己的方法来比较列表(在Guava中没有支持),但是您可以使用各种等价定义来调用此方法。

或者您可以滚动自己的界面:

interface Equalator<T> {
    boolean equals(T o1, T o2);
}

同样,你需要编写你的(普通)方法

boolean <T> listEquals(List<T> list1, List<T> list2, Equalator<T> equalator) {
    ...  
}

...但是您可以将它与不同的ListEqualator实现重用。