对象集包含带有值的对象(不是引用)(java 7)

时间:2017-04-04 14:40:50

标签: java set contains

我的对象有一些领域。

public class MyObject{

   private String a;
   private String b;

}

我有一个包含这样的对象:

Set<MyObject> thirdSet = new HashSet<MyObject>();

Set<MyObject> firstSet=getFirstSet();

Set<MyObject> secondSet = getSecondeSet();


for (MyObjectobj : firstSet) {
  if (!secondSet.contains(obj)) {
    thirdSet.add(obj);
  }
}

我需要选择我的secondSet中不包含的所有obj到thridSet(obj,值不是通过引用) 是否可能或使用集合更好?

2 个答案:

答案 0 :(得分:2)

您需要覆盖对象中的equals和hashcode方法。如果可以阻止NullPointerExceptions,我建议使用java 7 Objects实用程序方法。

@Override
public boolean equals(Object other) {
    if (!(other instanceof MyObject)) {
        return false;
    }
    MyObject that = (MyObject) other;
    return Objects.equals(a, that.a) && Objects.equals(b, that.b);
}

@Override
public int hashcode() {
    Objects.hash(a, b);
}

我还建议您尽可能查看第三方库Guava,这样可以简化您的代码。

Set<MyObject> thirdSet = new HashSet<>(Sets.difference(firstSet, secondSet));

请注意将其包装在新的HashSet中,以便对其进行修改(如果您不需要修改它,则可以将其删除)

答案 1 :(得分:1)

您应该覆盖MyObject.java中的Object#equalsObject#hashCode

@Override
public boolean equals(Object o) {
    if (!(o instanceof MyObject)) {
        return false;
    }

    MyObject m = (MyObject) o;

    return a.equals(m.a) && b.equals(m.b);
}

@Override
public int hashCode() {
    return Objects.hash(a, b);
}

此外,如果您被允许使用外部库,您应该查看Guava的Sets#difference