集合之间的不对称差异

时间:2014-08-12 13:49:24

标签: java

我正在处理两组包含我创建的复杂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)在这种情况下,获得不对称差异的好方法是什么?我猜是使用比较器,但我愿意接受建议。

谢谢!

3 个答案:

答案 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();
}

使用适当的equalshashCode,您应该只需使用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)

然后这样的对象满足这个方法将被认为是相同的并将占用集合,