2011-02-15 70 views
8

给定两个列表,每个列表持有相同的对象类型,我想根据某些属性值找到匹配的两个列表之间的对象。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听起来非常适合寻找匹配,但如果我是对的,它实际上并不允许我访问这些匹配。

我该怎么办?

+0

你能编辑存储在列表中的类的代码吗? – Alb 2011-02-15 23:41:22

+0

@Alb是我可以编辑代码 – QuakerOat 2011-02-16 00:20:24

回答

8

做你想看的对象实现equals(Object)hashCode()只考虑你关心的领域?如果是这样,您可以从第一个列表中创建一个新的HashSet,然后在第二个列表中调用retainAll()

如果他们不执行equals(Object)hashCode()相对于你关心的属性,你可以创建一个TreeSet,并通过在Comparator就是看你关心的属性。

0

我不知道如果我想着容易,但我会尝试这样的:

覆盖对象的equals方法来实现你的比较来检查它是否是同一个对象

然后如果对象也包含在第二个列表中,我将遍历第一个列表并检查contains方法。

然后我会遍历第二个列表并检查对象是否也在第一个列表中,而不是已经在结果列表中。

3

而不是使用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!"); 
+0

您需要将`equals(MyObj o)`更改为`equals(Object o)`。您不会像写入一样覆盖等于。 – ILMTitan 2011-02-15 23:50:37

0

所讨论的对象应实现boolean equals(Object)方法。例如:

L1Obj.equals(L2Obj); 

您可以重载该方法,以便您可以实现所需的相等操作。

1

你可以做一件事。有这两个对象的列表并重写这些对象所属类的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,而相反的情况并非如此。

相关问题