【问题标题】:How can I systematically empty an iterable object as I iterate through it? [duplicate]如何在迭代时系统地清空可迭代对象? [复制]
【发布时间】:2013-02-24 03:23:46
【问题描述】:

我有一个方法,它采用未知类型 T 的任何可迭代对象类型,并循环遍历它,从中取出项目并将其放入另一个数据结构中。我需要从旧的可迭代对象中删除每个项目,以便我可以按排序顺序将项目重新添加到其中。

我尝试在循环后在对象上使用.clear(),但不能保证有明确的方法。那么我如何在浏览时删除项目,或者创建一个具有相同类型但没有值的新对象,以便我可以重新添加所有内容,只知道该对象是Iterable

public class PriorityQueue<K extends Comparable<? super K>,V> {

  public static <K> void PriorityQueueSort(Iterable<? extends K> list,
        PriorityQueue<? super K, ?> queue) {

      for (K item : list) {
          queue.insert(item, null);
      }

      list.clear();
  }
}

【问题讨论】:

标签: java iterable


【解决方案1】:

不要使用 for-each 循环,而是使用显式的 Iterator 对象和 Iterator.remove()

    Iterator<K> iter = list.iterator();
    while (iter.hasNext()) {
        K item = iter.next();
        queue.insert(item, null);
        iter.remove();
    }

请记住,并非每个Iterator 实现都支持对象删除(例如,只读集合不支持)。

【讨论】:

    【解决方案2】:

    您必须使用Iterator 来浏览您的列表。迭代器支持 remove 方法。

    【讨论】:

      【解决方案3】:

      所有集合都是可迭代的,但相反的情况并非如此。因此,您甚至不能期望从生成迭代器项的数据源中删除某些内容总是有意义的。就像在这个非常复杂的 hello world 示例中一样:

      Iterable<Character> myIterable = new Iterable<Character>() {
      
          @Override
          public Iterator<Character> iterator() {
              Iterator<Character> it = new Iterator<Character>() {
      
                  private String hello = "Hello World";
                  private int counter = 0;
      
                  @Override
                  public boolean hasNext() {
                      return counter < hello.length();
                  }
      
                  @Override
                  public Character next() {
                      return hello.charAt(counter++);
                  }
      
                  @Override
                  public void remove() {
                      throw new UnsupportedOperationException();
                  }
      
              };
              return it;
          }
      };
      
      for (Character c : myIterable) {
          System.out.print(c);
      }
      

      没有支持 Iterable 的集合。它只是一个“迭代器提供者”,甚至只有一个字符串(我们不能从字符串中删除字符,字符串是不可变的)。

      所以不,您不能“清除任何可迭代”,并且并非每个迭代器都支持删除项目。

      【讨论】:

        猜你喜欢
        • 2018-08-19
        • 2019-06-03
        • 2019-12-03
        • 2021-10-25
        • 1970-01-01
        • 2013-03-07
        • 2015-11-07
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多