当我迭代它时,如何系统地清空可迭代对象?

时间:2013-03-08 14:35:31

标签: java iterable

我有一个方法,它接受任何具有未知类型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();
  }
}

3 个答案:

答案 0 :(得分:3)

使用明确的Iterator对象和Iterator.remove(),而不是使用for-each循环:

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

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

答案 1 :(得分:1)

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

答案 2 :(得分:1)

所有收藏品都是Iterables,但事实恰恰相反。因此,您甚至不能指望从生成迭代器项的数据源中删除某些内容总是有意义的。就像在这个相当复杂的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的集合。它只是一个“迭代器提供者”,甚至只有一个字符串(我们不能从字符串中删除字符,字符串是不可变的)。

所以不,你不能“清除任何可迭代的”而不是每个迭代器都支持删除项目。