【问题标题】:java - How to find matching objects between two lists?java - 如何在两个列表之间找到匹配的对象?
【发布时间】:2011-06-28 00:06:35
【问题描述】:

给定两个列表,每个列表都包含相同的对象类型,我想根据一些属性值在两个列表之间找到匹配的对象。

例如来自 List1 的对象 L1Obj 匹配来自 List2 的对象 L2Obj,如果 L1Obj.a == L2Obj.a AND L1Obj.b == L2Obj.c AND L1Obj.c == L2Obj.c

这些属性不是类的唯一属性,而是唯一标识列表中的对象所需的全部属性。

我的问题是 - 实现这一目标的最佳方法是什么?

一种方法是根据列表构造 HashMaps,将 a+b+c 的串联字符串值用作索引对象的键。这样我就可以遍历第一个列表,并尝试使用相同的键在第二个列表中查找对象。

这听起来怎么样?有没有更好的方法来实现这一点??

非常感谢所有帮助!


更新:

好的,所以实际上我需要更多。找到匹配项后,我想用 L2Obj 的属性覆盖属性 L1Obj.x、L1Obj.y、L1Obj.z。 HashSet 听起来很适合查找匹配项,但如果我是对的,它实际上并不允许我访问这些匹配项。

对此我能做些什么?

【问题讨论】:

  • 你能编辑存储在列表中的类的代码吗?

标签: java algorithm list data-structures


【解决方案1】:

您要查看的对象是否实现了仅考虑您关心的字段的equals(Object)hashCode()?如果是这样,您可以从第一个列表中创建一个新的HashSet,然后调用retainAll() 传入第二个列表。

如果他们没有针对您关心的属性实现equals(Object)hashCode(),您可以创建一个TreeSet 并传入一个查看您关心的属性的Comparator

【讨论】:

  • retainAll的恰当使用
【解决方案2】:

不要使用字符串表示,而是使用equals()方法a 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)。您不会像所写的那样覆盖 equals。
  • @Titan - 我注意到在您发表评论之前没有 hashCode :)。我原以为您可以将其保留为 MyObj,但我会对其进行清理以符合标准。
【解决方案3】:

你可以做一件事。有两个包含这些对象的列表,并覆盖这些对象所属类的 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() 时,两个相等的对象将具有相同的 hashCode,而反之则不然。

【讨论】:

    【解决方案4】:

    我不知道我是否想轻松,但我会这样尝试:

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

    然后我将遍历第一个列表并使用 contains 方法检查对象是否也包含在第二个列表中。

    然后我将遍历第二个列表并检查该对象是否也在第一个列表中并且尚未在结果列表中。

    【讨论】:

      【解决方案5】:

      有问题的对象应该实现boolean equals(Object) 方法。例如:

       L1Obj.equals(L2Obj);
      

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

      【讨论】:

        猜你喜欢
        • 2015-05-23
        • 2019-03-18
        • 1970-01-01
        • 2022-12-17
        • 2015-02-11
        • 2021-08-18
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多