java - 如何找到两个列表之间的匹配对象?
给定两个列表,每个列表持有相同的对象类型,我想根据某些属性值找到匹配的两个列表之间的对象。java - 如何找到两个列表之间的匹配对象?
例如从列表1,L1Obj,一个对象匹配从列表2,L2Obj一个对象,如果L1Obj.a == L2Obj.a AND L1Obj.b == L2Obj.c AND L1Obj.c == L2Obj.c
这些特性是不该类的唯一属性,但是唯一需要唯一标识列表中的对象。
我的问题是 - 达到这个目标的最佳方法是什么?
一种方式是基于列表构造HashMap,将a + b + c的concataned String值用作索引对象的关键字。这样我可以遍历第一个列表,并尝试使用同一个键在第二个列表中查找对象。
听起来如何?有没有更好的方式来实现这一目标?
所有帮助非常感谢!
UPDATE:
好了,其实我需要多一点。找到匹配项后,我想用L2Obj的属性覆盖属性L1Obj.x,L1Obj.y,L1Obj.z。 HashSet听起来非常适合寻找匹配,但如果我是对的,它实际上并不允许我访问这些匹配。
我该怎么办?
做你想看的对象实现equals(Object)
和hashCode()
只考虑你关心的领域?如果是这样,您可以从第一个列表中创建一个新的HashSet
,然后在第二个列表中调用retainAll()
。
如果他们不执行equals(Object)
和hashCode()
相对于你关心的属性,你可以创建一个TreeSet
,并通过在Comparator
就是看你关心的属性。
我不知道如果我想着容易,但我会尝试这样的:
覆盖对象的equals方法来实现你的比较来检查它是否是同一个对象
然后如果对象也包含在第二个列表中,我将遍历第一个列表并检查contains方法。
然后我会遍历第二个列表并检查对象是否也在第一个列表中,而不是已经在结果列表中。
而不是使用String repesntation,使用equals()
方法一个HashSet为这样:
class MyObj {
Property a;
Property b;
Property c;
public boolean equals(Object o) {
// use == if Property is primitive, like int or something
return o instanceof MyObj && a.equals(o.a) && b.equals(o.b) && c.equals(o.c);
}
// edit - when you override equals, also override hashcode
public int hashCode() {
return a.hashCode()^b.hashCode()^c.hashCode();
}
public String toString() {
return a.toString() + " " + b.toString() + " " + c.toString();
}
}
// later in your main method
Set<MyObj> objSet = new HashSet<MyObj>();
for(MyObj o : list1) objSet.add(o);
for(MyObj o : list2) if(objSet.contains(o)) System.out.println(o + " is a match!");
您需要将`equals(MyObj o)`更改为`equals(Object o)`。您不会像写入一样覆盖等于。 – ILMTitan 2011-02-15 23:50:37
所讨论的对象应实现boolean equals(Object)
方法。例如:
L1Obj.equals(L2Obj);
您可以重载该方法,以便您可以实现所需的相等操作。
你可以做一件事。有这两个对象的列表并重写这些对象所属类的equals方法。 你的equals方法应该看起来像
@Override
public boolean equals(Object obj)
{
return (this.a == obj.a && this.b == obj.b && this.c == obj.c)
}
还记得,当你重写equals方法,你需要重写INT的hashCode()方法为好。
有一点需要注意的是,在实现hashCode()时,2个相等的对象将具有相同的hashCode,而相反的情况并非如此。
你能编辑存储在列表中的类的代码吗? – Alb 2011-02-15 23:41:22
@Alb是我可以编辑代码 – QuakerOat 2011-02-16 00:20:24