簡體   English   中英

對象集包含按值包含對象的對象(非引用)(java 7)

[英]Set of object contains by object with value (not reference) (java 7)

我有一些領域的對象。

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);
  }
}

我需要選擇第二個集合中未包含的所有obj到thridSet中(值不按引用的obj)是否可能或使用collection更好?

您需要在對象中同時覆蓋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中,以便可以對其進行修改(如果不需要修改,可以將其刪除)

您應該在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

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM