获得 java 中两组之间对称差异的最佳方法是什么?

新手上路,请多包涵

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

我有:

 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"]


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

原文由 Simeon 发布,翻译遵循 CC BY-SA 4.0 许可协议

阅读 389
2 个回答

您可以使用 Google Guava 库中的一些函数(真的很棒,强烈推荐!):

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

difference()symmetricDifference() 的 Javadocs

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

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

原文由 Philipp Wendler 发布,翻译遵循 CC BY-SA 4.0 许可协议

你想要 对称差异

 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)

它返回一个不可修改的 Set 作为通用 Sets.SetView

Guava 更现代一些,支持泛型,但这些都可以。

原文由 Don Roby 发布,翻译遵循 CC BY-SA 4.0 许可协议

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题