我正在处理两组包含我创建的复杂java对象的数据。假设包含的元素是People.java类型,它具有String名称和int年龄。假设我有这些集:
Set1 = [{James, 25}, {Arthur, 18}, {Anne, 22}]
Set2 = [{Arthur, 18}, {James, 25}]
我试图获得set1和set2之间的不对称差异,以便差异的结果是{Anne,22}。我已经尝试将元素存储在HashSet中并使用set1.removeAll(set2),但答案等于set1。需要注意的是,每个元素都是一个不同的实例,这意味着我在set1中为{James,25}创建了一个Person对象,在set2中为{James,25}创建了一个新的Person对象(这就是为什么它们是不同的实例,因为我正在简化项目的目标)。
我也试过Google的Guava difference,但答案仍然等于set1。
我有两个问题: 1)为什么会这样?是因为它们是不同的实例,removeAll进程认为它们是不同的? 2)在这种情况下,获得不对称差异的好方法是什么?我猜是使用比较器,但我愿意接受建议。
谢谢!
答案 0 :(得分:3)
您必须没有覆盖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();
}
使用适当的equals
和hashCode
,您应该只需使用set1.removeAll(set2)
即可获得所需的结果。
答案 1 :(得分:1)
你的方法很好,但你可能忘了
@Override
public int hashCode()
@Override
public boolean equals(Object other)
答案 2 :(得分:1)
不覆盖hasCode()
和equals(Object people)
,
object 1
{Arthur,18}和object 2
{Arthur,18}具有相同的值会被视为不同。
当您覆盖以下方法
时public int hashCode()
public boolean equals(Object other)
然后这样的对象满足这个方法将被认为是相同的并将占用集合,