5

有没有像 Comparator 这样的 Equalator 机制,所以我可以有不同的等号来比较列表?

编辑:我的目标是区分当前 list1.equals(list2) 检查它是浅拷贝还是深拷贝所有对象 a.equals(b) 和 list1.identical(list2) 检查它是否只是浅拷贝未经修改的清单

所有这些列表都来自同一模型。有些是自身的副本,因此它们持有指向相同对象的指针,而另一些是深层副本,因此层次结构被完全复制,因为它们在内容上进行了更新,而不仅仅是在结构上。

我发现自己经常制作 list1.equals(list2) 但我需要一种机制来判断两者是否是 TOTAL 副本(相同的对象以相同的集合顺序)或者有时它们是否是 LOGICAL 副本(通过我自己实现的逻辑等于),所以列出会调用 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) 并且只有当包含的对象完全相同时才会这样。

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

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

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

4

2 回答 2

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 实现重用它。

于 2013-02-26T20:58:47.150 回答
2

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

在给定的 Collection 具体类型中,大多数 equals 实现已经按照您的提示进行。例如:

    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 方法。

如果这不符合您的要求,您可以自己扩展 Collections 并覆盖那里的任何方法来做类似的事情。

这有帮助吗?

于 2012-08-01T11:52:29.840 回答