有 Java 编程相关的问题?

你可以在下面搜索框中键入要查询的问题!

如何在Java中迭代HashSet元素时覆盖该元素

在对某个HashSet元素进行迭代时,是否可以覆盖该元素(不一定是迭代的元素)。我想知道除了删除、编辑然后重新添加之外还有什么方法? 我问这个问题的原因是,在迭代时使用remove总是会给java带来一些好处。util。ConcurrentModificationException。我发现没有方法覆盖set元素

任何帮助都将不胜感激

谢谢

索姆纳特


共 (4) 个答案

  1. # 1 楼答案

    您可以从Collection中删除一个项(包括Set),同时对其进行迭代,只要您使用Iterator对其进行迭代并调用^{}执行删除操作。但是,这只允许您删除迭代中的当前项

    您不能删除另一项或添加另一项,因为这将导致ConcurrentModificationException,因为如果更改Set,则不清楚如何对其进行迭代

    此外,与List不同的是,在Set中谈论替换一个条目是没有意义的。在aList中,项具有定义顺序,因此,例如,如果第二个条目是“a”,则可以将其替换为“B”。aSet中的项没有顺序,因此不能直接用另一项替换,只能删除旧项并添加新项

    取决于您想做什么,您最好的方法可能是在Set的副本上循环:

    Set<Object> originalSet = someMethod(); 
    
    for (Object item : new HashSet<Object>(originalSet)) {
      //do stuff which modifies originalSet
    }
    

    但是,您必须考虑这样一个事实,即您迭代的对象将是原始值,并且不会反映您所做的任何更改

    如果这样做不行,那么找到另一种方法来处理Set中的项可能是有意义的,而不需要通过跟踪已处理的节点来简单地迭代它们

    这样做可能会有帮助,但可能会有所改进,具体取决于您所做的工作:

    Set<Object> originalSet = somemethod();
    
    //Keep track of items we've already processed
    Set<Object> processed = new HashSet<Object>();
    
    //toDo is used to calculate which items in originalSet aren't in processed
    Set<Object> toDo = new HashSet(originalSet);
    toDo.removeAll(processed);
    
    while (! toDo.isEmpty()) {
      //Get an object from toDo
      Object item = toDo.iterator().next();
    
      //Do some processing
      //Can update originalSet or even remove from processed if we want to re-do an item
    
      //Recalculate what's left to do
      processed.add(item);
      toDo = new HashSet(originalSet);
      toDo.removeAll(processed);
    }
    
  2. # 2 楼答案

    没有办法做到这一点。因为替换一个元素基本上就是删除+插入。 这是一个集合,不是列表。例如,在一个集合{1,2}中有两个元素,您希望用{2}替换{1}。这是不可能的,因为结果集不能包含{2,2}-即两个相等的元素

  3. # 3 楼答案

    Set<Key> set = Sets.newHashSet();
    // ...
    
    for (Key k : ImmutableSet.copyOf(set)) {
      if (needToMessWith(k)) {
        set.remove(k);
        k.mutateAsNeeded();
        set.add(k);
      }
    }
    

    //我使用了番石榴系列代码。没有它也很简单

  4. # 4 楼答案

    只需将set转换为List并使用^{},完成此操作后,将其转换回Set

    或者在迭代时维护另一个Set