java中集合的对称差分

java中集合的对称差分,java,set,generic-programming,Java,Set,Generic Programming,我试图在java中实现集合的对称差分 我已经评论了我缺少一些概念的那一行。请帮忙 public static <T> Set<T> symmetricDifference(Set<? extends T> set1, Set<? extends T> set2) { for(<? extends T> a : set1) { if(set2.contains(a))

我试图在java中实现集合的对称差分 我已经评论了我缺少一些概念的那一行。请帮忙

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

}

公共静态集对称性差异(Set两个集合的对称差是它们差的并集。现在,您的问题是,您有一个方法返回一个集合,然后修改输入集合,使其失真。您需要创建一个新集合并添加所需的元素。为此,您需要迭代第一个集合并将项目添加到在第二个集合中未找到的新集合,然后迭代第二个集合,并将在第一个集合中未找到的项添加到新集合中。公式为:

A△ B=(A-B)∪ (B–A)

或:


A△ B=(A)∪ B) -(A)∩ B)

这可以通过使用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;
}

public static Set symmetricDifference(SetWhat's error?'Main.java:11:error:Set ans=new Set()类型的非法开始;^'@benjaminurquhart因此错误发生在未显示的代码中?Set是一个接口,无法实例化。例如,使用其实现之一,如HashSet。
(使用流的更简单方法是
Stream.concat(set1.Stream(),set2.Stream()).filter(e->!set1.contains(e)| |!set2.contains(e)).collect(toSet())
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;
}