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