【问题标题】:Compare sets inside a set比较集合内的集合
【发布时间】:2016-01-23 12:45:31
【问题描述】:

我有一套这样的:

Set<Set<Node>> NestedSet = new HashSet<Set<Node>>();

[[Node[0], Node[1], Node[2]], [Node[0], Node[2], Node[6]], [Node[3], Node[4], Node[5]]]

我想比较和合并嵌套集中的集合。 [0,1,2] 和 [0,2,6] 具有共同的元素。所以应该将它们合并成0,1,2,6。

输出应该是这样的:

[[Node[0], Node[1], Node[2], Node[6]], [Node[3], Node[4], Node[5]]]

有什么有效的方法吗?

【问题讨论】:

  • 您可以使用github.com/google/guava 在两个嵌套集之间进行交集,如果交集 > 0 则合并这两个集。当然这不是最有效的方法,因为您必须在最坏的情况下比较 O(n^2) 个元素。

标签: java lambda set guava lambdaj


【解决方案1】:

您可以使用Collections.disjoint(Collection c1, Collection c2) 来检查两个指定的集合是否有共同的元素。

顺便说一句,确保您的 Node 类实现了 hashCodeequals

Set<Set<Node>> result = new HashSet<Set<Node>>();
for (Set<Node> s1 : NestedSet) {
    Optional<Set<Node>> findFirst = result.stream().filter(p -> !Collections.disjoint(s1, p)).findFirst();
    if (findFirst.isPresent()){
        findFirst.get().addAll(s1); 
    }
    else {
        result.add(s1);
    }
}

【讨论】:

  • 非常感谢您的帮助。有效!但是如果我想将它添加到 S1 集合中,只有当它有两个共同元素时,它应该如何?像这样:如果 (findFirst.isPresent() and count =2) then add??有可能吗?
  • 是的,您可以使用 retainAll 函数:可选> findFirst = result.stream().filter(p -> { HashSet temp = new HashSet( s1); temp.retainAll(p); return temp.size() == 2; }).findFirst();
  • 再次感谢!但这出了点问题。这是后续行动。 link 。你能参考这个链接吗?
猜你喜欢
  • 1970-01-01
  • 2011-11-18
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-08-04
  • 2018-11-20
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多