gpt4 book ai didi

java - 集合之间的不对称差异

转载 作者:行者123 更新时间:2023-11-29 07:46:23 25 4
gpt4 key购买 nike

我正在处理两组包含我创建的复杂 Java 对象的数据。假设包含的元素属于 People.java 类型,它有一个 String name 和一个 int age。假设我有这些集合:

Set1 = [{James, 25}, {Arthur, 18}, {Anne, 22}]

Set2 = [{Arthur, 18}, {James, 25}]

我正在尝试获取 set1 和 set2 之间的不对称差异,以便该差异的结果是 {Anne, 22}。我试过将元素存储在 HashSets 中并使用 set1.removeAll(set2),但答案等于 set1。需要注意的重要一点是,每个元素都是一个不同的实例,这意味着我在 set1 中为 {James, 25} 创建了一个 Person 对象,在 set2 中为 {James, 25} 创建了一个新的 Person 对象(它们是不同的实例是有原因的,因为我正在简化项目的目标)。

我也试过 Google 的 Guava 的 difference , 但答案仍然等于 set1。

我有两个问题:1)为什么会这样?是因为它们是不同的实例,所以 removeAll 过程认为它们不同吗?2)在这种情况下获得不对称差异的好方法是什么?我猜想使用比较器,但我愿意接受建议。

谢谢!

最佳答案

您一定没有覆盖 equals(和/或 hashCode),因此您的 Person 实例是通过引用而不是值进行比较的.应该这样做(在 Person 类中):

@Override
public boolean equals(Object o) {
if (o instanceof Person) {
Person p = (Person) o;
return name.equals(p.name) && age == p.age;
}
return false;
}

@Override
public int hashCode() {
return Arrays.asList(name, age).hashCode();
}

通过适当的equalshashCode,您应该能够简单地使用set1.removeAll(set2) 来获得所需的结果。

关于java - 集合之间的不对称差异,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25266028/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com