在Java中查找匹配对象
我目前正试图根据两个对象的值匹配它们。除了,它不是a.a = a.a
,而是a.a = a.b
和a.b = b.a
。这意味着覆盖equals
是一个选项,但它肯定不是正确的选项
虽然对这些对象进行排序将加快匹配时间,但总体数量将很小,因此没有必要。另外,compareTo
也不完全正确,原因与equals
相同
我是否只是制定自己的方法以防万一?将有4个字段要匹配,这就是为什么我不在前面使用if语句的原因
public boolean isOpposite(Object other) {
return (this.a == other.b) ? true : false;
}
还有一种可能性是,对象将实现/扩展一个基础对象,以获得更多字段并实现其自己的匹配方式
我正在考虑使用LinkedList
,因为我知道它比ArrayList
快,但是我也在考虑使用Map
。
编辑:更好地解释对象
public class Obj {
public String a;
public String b;
public String c;
public double d;
}
这些关系如下:
Obj obj1, obj2;
obj1.a == obj2.b //.equals for String of course
obj1.b == obj2.a
obj1.c == obj2.c
obj1.d == obj2.d * -1
# 1 楼答案
我已经做了一些测试,并确定我知道如何实现这一点的最干净的方法是使用
ArrayList<Obj>
这是我的实现:
我对4000000个psuedo random
Obj
对象的样本进行了测试。这是我的输出:# 2 楼答案
正如您所提到的,覆盖
equals
或compareTo
不是正确的方法。因为有一个假设,即两种方法都应该是可传递的,即A eq B and B eq C => A eq C
,但它不适用于“相反”的对象。知道这一点很好,因为您无法定义一个等价类并将其划分为子集,但您需要找到所有对(取决于您的用例)不确定,你的目标是什么。如果你有一些容器中有这样的对象,你需要找到所有满足条件的对,那么我恐怕你需要进行n^2比较
我可能会创建两个散列集,一个是原始散列集,另一个是相反的散列集,然后询问第二个散列集是否包含原始散列集每个成员的对立面