【问题标题】:Removing an element while using multiple iterators on a Java HashSet在 Java HashSet 上使用多个迭代器时删除元素
【发布时间】:2020-06-09 15:30:58
【问题描述】:

我正在尝试基于共享一个或多个公共元素来更新一组 Set,当两个元素具有一个(或多个)公共元素时,它们将组合为一个元素,依此类推。

例如:

输入:{{1,2}, {3,4,5}, {2,4}, {7,8}}

输出应该是:{{1,2,3,4,5}, {7,8}}

输入:{{1, 2}, {5, 8, 9}, {3, 4, 5}, {2, 4, 7}, {7, 8}}

输出应该是:{{1, 2, 3, 4, 5, 7, 8, 9}}

这是我的 Java 实现,

   static boolean hasCommon(HashSet<Integer> s1, HashSet<Integer> s2)
   {
      for (Integer i : s1)
      {
         if (s2.contains(i))
            return true;
      }
      return false;
   }

   static HashSet<HashSet<Integer>> updateElements(HashSet<HashSet<Integer>> newSetofSets)
   {
      Iterator<HashSet<Integer>> it = newSetofSets.iterator();

      while (it.hasNext())
      {
         HashSet<Integer> s1 = it.next();

         Iterator<HashSet<Integer>> it2 = it;

         while (it2.hasNext())
         {
            HashSet<Integer> s2 = it2.next();

            System.out.println("s1 = " + s1.toString() + ", s2 = " + s2.toString());
            System.out.println(newSetofSets.toString());

            if (hasCommon(s1, s2))
            {
               for (Integer i : s2)
               {
                  s1.add(i);
               }

               it2.remove(); // remove s2 after adding its elements to s1.
               System.out.println(newSetofSets.toString());
            }
         }
         System.out.println(newSetofSets.toString());
      }

      return newSetofSets;
   }

对于输入:[[1, 2], [5, 8, 9], [3, 4, 5], [2, 4, 7], [7, 8]]

我明白了,

[[1, 2, 4, 7, 8], [5, 8, 9], [3, 4, 5]]

it 完成后,第一个迭代器 it 不会移动到下一个元素。

我们将不胜感激任何解决此问题的帮助。谢谢。

【问题讨论】:

  • 请记住,从您正在循环的集合中添加/删除项目并不是一个好的做法。
  • 感谢您的信息,但它应该有一些解决方案。我需要学习。

标签: java iterator set hashset


【解决方案1】:

您的代码中只有一个迭代器。当你执行以下代码时:

Iterator<HashSet<Integer>> it2 = it;

您期望创建一个新的迭代器it2,它在it 停止的位置继续。不是这种情况。您正在做的是创建一个指向同一个迭代器的新变量。这称为“传递引用”。

所以现在你有 2 个变量指向同一个迭代器。当您使用it2.next() 时,它与说it.next() 相同。当第二个 while 循环完成时,迭代器位于列表末尾,it.hasNext() 将为 false,因为 it2.hasNext()it.hasNext() 相同。

【讨论】:

  • 所以,我发现了问题,现在我必须想办法离开这里。
猜你喜欢
  • 2015-06-30
  • 2018-10-01
  • 2010-11-09
  • 2019-09-11
  • 1970-01-01
  • 2021-05-05
  • 1970-01-01
  • 2016-07-19
  • 1970-01-01
相关资源
最近更新 更多