如果我有两个集合:
Set<Integer> test1 = new HashSet<Integer>();
test1.add(1);
test1.add(2);
test1.add(3);
Set<Integer> test2 = new HashSet<Integer>();
test2.add(1);
test2.add(2);
test2.add(3);
test2.add(4);
test2.add(5);
是否有一种方法来比较它们,只返回一组4和5 ?
如果我有两个集合:
Set<Integer> test1 = new HashSet<Integer>();
test1.add(1);
test1.add(2);
test1.add(3);
Set<Integer> test2 = new HashSet<Integer>();
test2.add(1);
test2.add(2);
test2.add(3);
test2.add(4);
test2.add(5);
是否有一种方法来比较它们,只返回一组4和5 ?
当前回答
顺序很重要,因为你需要4和5是int(不是Integer), 使用test2.removeAll (test1)。
其他回答
Yes:
test2.removeAll(test1)
尽管这会使test2发生变异,所以如果需要保留它,请创建一个副本。
此外,您可能指的是<Integer>而不是<int>。
试试这个
test2.removeAll(test1);
组# removeAll
从此集合中删除指定集合中包含的所有元素(可选操作)。如果指定的集合也是一个集合,则此操作将有效地修改该集合,使其值为两个集合的非对称集之差。
如果你正在使用Java 8,你可以尝试这样做:
public Set<Number> difference(final Set<Number> set1, final Set<Number> set2){
final Set<Number> larger = set1.size() > set2.size() ? set1 : set2;
final Set<Number> smaller = larger.equals(set1) ? set2 : set1;
return larger.stream().filter(n -> !smaller.contains(n)).collect(Collectors.toSet());
}
如果你使用Guava(前谷歌集合)库有一个解决方案:
SetView<Number> difference = com.google.common.collect.Sets.difference(test2, test1);
返回的SetView是一个Set,它是一个动态表示,你可以使它不可变或复制到另一个Set。Test1和test2保持不变。
顺序很重要,因为你需要4和5是int(不是Integer), 使用test2.removeAll (test1)。