如何在Java中定义一组通用类型?

时间:2019-05-18 18:29:07

标签: java set generic-programming

请告诉我注释行出了什么问题。

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中实现集合的对称差异

2 个答案:

答案 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()方法)