嗨,我已经看过这篇文章,当您有两组数据(即字符串)时如何实现联合和交集。当我的集合包含对象时,我该如何做同样的事情,并且我只想获得一个属性的联合每个对象?
问问题
2932 次
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,因此您还必须覆盖equals
Class 中的方法并实现基于单一属性的比较。
如果是简单的比较,这里有一个例子(由我的 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 回答