2017-04-04 166 views
2

我有我的对象与一些feilds。对象集包含与对象的值(不参考)(Java 7)

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到thridSet所有OBJ(OBJ有没有参考值) 是否有可能或使用集合更好?

回答

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

此外,如果你被允许使用外部库,你应该检查出番石榴的Sets#difference

+0

谢谢多数民众赞成在工作 – mir

+0

@xenu没问题,请接受答案! –

+1

其完成@Jacob :) – mir

0

您需要重写对象中的equals和hashcode方法。如果可以阻止NullPointerException,我建议使用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); 
} 

我还建议看看第三方库番石榴如果可能,这将简化您的代码。

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

注意包装在一个新的HashSet,因此它可以被修改(如果你不需要修改它,你可以删除)

+0

我不使用Guawa,但感谢您的回复 – mir