2

嗨,我已经看过这篇文章,当您有两组数据(即字符串)时如何实现联合和交集。当我的集合包含对象时,我该如何做同样的事情,并且我只想获得一个属性的联合每个对象?

4

4 回答 4

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);
于 2012-12-20T09:35:16.173 回答
1

Google Guava 有 Sets 类,其中包含这些方法等等。

于 2012-12-20T09:24:44.440 回答
0

这个答案中,使用集合方法retainAll(Collection)- 交集和#addAll(Collection)- 联合。

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

如果是简单的比较,这里有一个例子(由我的 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;
}
于 2012-12-20T09:22:07.337 回答
0

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

我没有找到关于set.addAll()实现的具体评论,但很可能它也用于equals()确定一个对象是否已经在场景中。

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

于 2012-12-20T09:17:06.977 回答