如何实现集理论与对象集的并集和交集

时间:2012-12-20 09:07:43

标签: java union set

嗨我已经看到这个post如何实现联合和交集,当你有两组数据时,就是strings.how我可以在我的集合包含对象时做同样的事情,我想要得到每个对象只有一个属性的联合?

4 个答案:

答案 0 :(得分:2)

  

但是我想以某种方式覆盖它们,以便它不会添加一个对象,如果我的集合中已有一个对象在所选属性中具有相同的值。如果我不够清楚告诉我,那么我可以写一个例子

我认为最好的方法是使用ConcurrentMap。

ConcurrentMap<String, MyType> map = new ConcurrentHashMap<>();

// the collection to retain.
for(MyType mt: retainedSet) map.put(mt.getKey(), mt);

// the collection to keep if not duplicated
for(MyType mt: onlyIfNewSet) map.putIfAbsent(mt.getKey(), mt);

// to get the intersection.
Set<String> toKeep = new HashSet<>();
for(MyType mt: onlyIfNewSet) toKeep.add(mt.getKey());

// keep only the keys which match.
map.keySet().retainAll(toKeep);

答案 1 :(得分:1)

Google Guava,包含这些方法的Sets类等等。

答案 2 :(得分:0)

交叉点正在使用contains,它使用等于。您应该在要进行交集的类上实现equals()方法。

我没有找到关于set.addAll()实现的具体评论,但很可能它还使用equals()来确定某个对象是否已经在该集合上。

如果您只想按字段进行比较,则您的equals()应仅比较此字段。

答案 3 :(得分:0)

this answer一样,使用Collection方法retainAll(Collection) - 交集和#addAll(Collection) - 联合。

由于这些方法使用equals,因此您还必须覆盖类中的equals方法并实现基于属性的比较。

如果是简单比较,这是一个例子(由我的IDEA生成):

public class Main {

private Integer age;

...

@Override
public boolean equals(Object o) {
    if (this == o) return true;
    if (o == null || getClass() != o.getClass()) return false;

    Main main = (Main) o;

    if (age != null ? !age.equals(main.age) : main.age != null) return false;

    return true;
}