请告诉我注释行出了什么问题。
public static <T> Set<T> symmetricDifference(Set<? extends T> set1, Set<? extends T> set2) {
for(<? extends T> a : set1)
{
if(set2.contains(a))
{
set1.remove(a);
set2.remove(a);
}
else
set2.add(a); //what is wrong with this line
}
return set2;
}
}
我正在尝试在Java中实现集合的对称差异
答案 0 :(得分:1)
两组的对称差异是它们差异的并集。现在,您遇到的问题是您有一个返回一个集的方法,并且您修改了输入集并使它们失真。您需要创建一个新的Set并添加所需的元素。为此,您需要迭代第一个集合,并将第二个集合中找不到的项目添加到新集合中,然后迭代第二个集合,并将在第二个集合中找不到的项目添加到新集合中。第一盘。公式是:
A△B =(A – B)∪(B – A)
或:
A△B =(A∪B)-(A∩B)
答案 1 :(得分:0)
使用Java 8流可以轻松完成此操作:
public static <T> Set<T> symmetricDifference(Set<? extends T> set1, Set<? extends T> set2) {
Set<T> set = set1.stream()
.filter(e -> !set2.contains(e))
.collect(Collectors.toSet());
set2.stream()
.filter(e -> !set1.contains(e))
.forEach(set::add);
return set;
}
或Java 7及以下版本的解决方案:
public static <T> Set<T> symmetricDifference2(Set<? extends T> set1, Set<? extends T> set2) {
Set<T> s = new HashSet<>();
for (T t1 : set1) {
if(!set2.contains(t1))
s.add(t1);
}
for (T t2 : set2) {
if(!set1.contains(t2))
s.add(t2);
}
return s;
}
但是,这没有多大意义。如果set1的通用类型与set2的通用类型不同,则没有任何机会排除任何元素,因为set1和set2都将包含T的不同实现(除非您强制执行equals()和hashCode()方法)