2012-12-20 33 views
2

嗨,我已经看到这个post如何实现联合和交集,当你有两组数据,那就是strings.how我可以做当我的集合包含对象时也是如此,并且我想要获得每个对象只有一个属性的联合?我该如何实现联合和集合论与对象集的交集

+0

“sets contains objects”:'o'bjects or'O'bjects? –

+1

你的意思是喜欢用'retainAll'(intersection)还是'addAll'(union)? –

+0

@Peter Lawrey完全是这两个方法。但我想以某种方式覆盖它们,以便它不会添加一个对象,如果有一个对象已经在我的集合中具有相同的值在选定的属性。如果我不够清楚告诉我可以写一个例子。 – user1746708

回答

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); 
+0

好吧,它看起来不错,谢谢,但我很抱歉无法弄清楚这是如何工作。我的意思是我猜我的MyType是我的自定义对象,但我怎么能选择基于在什么领域应该进行联合和结合? – user1746708

+0

“MyType”是您的自定义类型,“getKey()”是您想要键入的字段。 –

+0

好的,谢谢我会试试看,并回复你 – user1746708

0

交叉点使用contains,它使用equals。您应该在要交叉的课程上实施equals()方法。

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

如果你只想通过一个字段进行比较,你的equals()只应该比较这个字段。

+0

好吧,我认为这是这样的事情,但你看我现在对工会一方更感兴趣。你确定我应该再次重写equals()? – user1746708

+0

Java总是使用equals()来查看对象是否等于,并且addAll()规范说它执行union(http://docs.oracle.com/javase/1.4.2/docs/api/java/util/Collection的.html#中的addAll%28java.util.Collection%29)。我没有看到任何理由考虑一个不同的行为 – dgmora

0

this answer一样,使用Collection方法retainAll(Collection) - intersection和#addAll(Collection) - union。

由于这些方法使用equals,所以还必须重写Class中的equals方法并实现基于一个属性的比较。

如果它是简单的对比,这里是一个例子(由我的想法产生):

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; 
} 
+0

好吧我有这样的想法,但我怎么能正确覆盖equals()? – user1746708

+0

我用一个例子更新了答案。如果你想深入了解'equals',[这里是一个很好的答案](http://stackoverflow.com/a/27609/760484)。 – tadaskay

+0

好的,谢谢我会试试看,并回复给你 – user1746708

1

谷歌番石榴,具有集类,它包含这些方法等等。