【问题标题】:Set of object contains by object with value (not reference) (java 7)对象集包含具有值的对象(非引用)(java 7)
【发布时间】:2017-08-29 20:11:24
【问题描述】:

我的对象有一些领域。

public class MyObject{

   private String a;
   private String b;

}

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

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 的值不是通过引用) 有可能还是使用收集更好?

【问题讨论】:

    标签: java set contains


    【解决方案1】:

    您需要覆盖对象中的 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 中以便可以修改它(如果你不需要修改它,你可以删除它)

    【讨论】:

      【解决方案2】:

      您应该在 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

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2018-07-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2011-01-01
        • 2015-01-30
        • 2011-10-17
        相关资源
        最近更新 更多