gpt4 book ai didi

java - 集合中的对象具有不同相等(物理相等和逻辑相等)的机制

转载 作者:搜寻专家 更新时间:2023-10-31 20:14:27 26 4
gpt4 key购买 nike

是否有类似 Comparator 的 Equalator 机制,以便我可以为比较列表设置不同的 equals?

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

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

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

我的问题是没有 Equalator 接口(interface),如果我覆盖对象等于我失去了通过 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)

最佳答案

您的问题并没有真正清楚地表达出来,至少对我而言是这样。如果这不能正确回答,你能改一下吗?

在给定的 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 并覆盖其中的任何方法来执行类似的操作。

这有帮助吗?

关于java - 集合中的对象具有不同相等(物理相等和逻辑相等)的机制,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11758220/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com