在java中获取两个集合之间的对称差异的最佳方法是什么?

2022-09-01 01:18:49

我想知道是否有一种快速/干净的方法来获得两个集合之间的对称差异?

我有:

Set<String> s1 = new HashSet<String>();
s1.add("a");
s1.add("b");
s1.add("c");

Set<String> s2 = new HashSet<String>();
s2.add("b");

我需要类似的东西:

Set<String> diff = Something.diff(s1, s2);
// diff would contain ["a", "c"]

只是为了澄清我需要对称差异。


答案 1

您可以使用Google番石榴库中的一些功能(这真的很棒,我强烈推荐它!

Sets.difference(s1, s2);
Sets.symmetricDifference(s1, s2);

Javadocs for difference()symmetricDifference()

symmetricDifference()完全符合您的要求,但也经常有帮助。difference()

这两种方法都返回实时视图,但例如,您可以调用结果集以获取未更改的集合。如果您不想要视图,但需要可以修改的设置实例,请调用 .有关这些方法,请参阅 SetView.immutableCopy().copyInto(s3)


答案 2

你想要对称的差异

public static <T> Set<T> diff(final Set<? extends T> s1, final Set<? extends T> s2) {
    Set<T> symmetricDiff = new HashSet<T>(s1);
    symmetricDiff.addAll(s2);
    Set<T> tmp = new HashSet<T>(s1);
    tmp.retainAll(s2);
    symmetricDiff.removeAll(tmp);
    return symmetricDiff;
}

如果你想要一个库,Apache Commons CollectionUtils

CollectionUtils.disjunction(s1, s2)

这将返回一个非泛型 。Collection

番石榴套装

Sets.symmetricDifference(s1, s2)

它返回一个不可修改的泛型。SetSets.SetView

番石榴更现代,支持仿制药,但这些都可以工作。