Whi*_*cal 5 java collections list equals comparator
有没有像比较器那样的Equalator机制,所以我可以在复制列表中使用不同的等号?
编辑:我的目标是区分当前list1.equals(list2),它检查它是一个浅拷贝还是一个深拷贝与所有对象a.equals(b)和list1.identical(list2)检查它是否只是浅拷贝未经修改的列表
所有这些列表都来自同一型号.有些是自己的副本,因此它们保存指向同一对象的指针,而其他则是深层副本,因此层次结构完全被复制,因为它们具有内容更新,而不仅仅是结构.
我发现自己经常使用listl.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());
}
});
Run Code Online (Sandbox Code Playgroud)
并且我仍然可以执行list1.equals(list2),因此它们使用默认等于(obj1 == obj2),这仅在包含的对象完全相同时才为真.
第一个操作对于检查列表(可能是模型中完全重新创建的对象的更新列表)是否仍等于旧列表非常有用.
第二个操作对于检查列表是否有用(它是旧版本数据模型的浅层副本),它不包含任何超越的更改,因为它是udpdated版本时在代码中移动它.
编辑:一个很好的例子是有一个Point(x,y)列表.我们应该能够知道两个列表是否相等,因为它们是完全相同的点集或相等,因为它们包含的点在逻辑方式上是相等的.如果我们可以将phyEqual和logEqual都实现为object,并且在任何对象中都有这两个方法,那么list.phyEqual(list2)或list1.logEqual(list2)
你的问题并没有很清楚地表达出来,至少对我来说是这样。如果这不能正确回答,你能稍微改一下吗?
在给定的 Collection 具体类型中,大多数 equals 实现已经执行您暗示的操作。例如:
public boolean equals(Object o) {
if (o == this)
return true;
Run Code Online (Sandbox Code Playgroud)
在这种情况下,这样的事情可能是有意义的。
您可以轻松地覆盖它:
@Override
public boolean equals(Object o) {
if (o.getPrimaryKey() == this.getPrimaryKey())
return true;
return super().equals(o);
Run Code Online (Sandbox Code Playgroud)
[应该添加空值测试] 如果您正在创建标准集合,您甚至可以在构造过程中匿名重写 equals 方法。
如果这不能满足您的要求,您可以自己扩展 Collections 并重写其中的任何方法来执行类似的操作。
这有帮助吗?
归档时间: |
|
查看次数: |
602 次 |
最近记录: |