Java 中的深度比较集

发布于 2024-10-08 12:12:15 字数 118 浏览 0 评论 0原文

我在 Java 中有两个集合来比较 Item 对象。是否有一种方法可以比较集合,以便调用 Itemequals 方法,而不仅仅是比较引用?

I have two sets in Java that compare Item objects. Is there a method to compare the sets so that Item's equals method is invoked and not just compare references?

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(2

落花随流水 2024-10-15 12:12:15

AbstractSet 的每个子级都会这样做。请参阅文档

公共布尔等于(Object o)

比较指定对象与此集合是否相等。如果给定对象也是一个集合,两个集合具有相同的大小,并且给定集合的每个成员都包含在该集合中,则返回 true。这可确保 equals 方法在 Set 接口的不同实现中正常工作。
这个实现首先检查指定的对象是否是这个集合;如果是,则返回 true。然后,它检查指定对象是否是一个集合,其大小与该集合的大小相同;如果不是,则返回 false。如果是,则返回 containsAll((Collection) o)。

所以实际上这依赖于 contains 实现(由 containsAll(..) 调用)。对于 HashSet (至少)这就是您正在寻找的。

Each child of AbstractSet does that. See the docs

public boolean equals(Object o)

Compares the specified object with this set for equality. Returns true if the given object is also a set, the two sets have the same size, and every member of the given set is contained in this set. This ensures that the equals method works properly across different implementations of the Set interface.
This implementation first checks if the specified object is this set; if so it returns true. Then, it checks if the specified object is a set whose size is identical to the size of this set; if not, it returns false. If so, it returns containsAll((Collection) o).

So in fact this relies on the contains implementation (which is invoked by containsAll(..)). For HashSet (at least) this is what you are looking for.

等你爱我 2024-10-15 12:12:15

这是默认行为,如果不是您所看到的,请检查您是否也覆盖了 hashCode。请参阅以下代码作为示例:

public static void main(String[] args) {
    Set<Item> items1 = new HashSet<Item>();
    items1.add(new Item("item 1"));
    items1.add(new Item("item 2"));

    Set<Item> items2 = new HashSet<Item>();
    items2.add(new Item("item 1"));
    items2.add(new Item("item 2"));

    System.out.println(items1.equals(items2));
}

private static class Item {
    private String id;

    public Item(String id) {
        this.id = id;
    }

    @Override
    public int hashCode() {
        return id.hashCode();
    }

    @Override
    public boolean equals(Object obj) {
        return id.equals(((Item)obj).id);
    }
} 

此输出:

正确

This is the default behaviour, if it's not what you're seeing then check that you're overriding hashCode as well. See the following code for an example:

public static void main(String[] args) {
    Set<Item> items1 = new HashSet<Item>();
    items1.add(new Item("item 1"));
    items1.add(new Item("item 2"));

    Set<Item> items2 = new HashSet<Item>();
    items2.add(new Item("item 1"));
    items2.add(new Item("item 2"));

    System.out.println(items1.equals(items2));
}

private static class Item {
    private String id;

    public Item(String id) {
        this.id = id;
    }

    @Override
    public int hashCode() {
        return id.hashCode();
    }

    @Override
    public boolean equals(Object obj) {
        return id.equals(((Item)obj).id);
    }
} 

This outputs:

true

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文