2

我有一个方法,它采用未知类型 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();
  }
}
4

3 回答 3

3

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

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

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

于 2013-03-08T14:37:48.217 回答
1

您必须使用迭代器来遍历您的列表。迭代器支持 remove 方法。

于 2013-03-08T14:38:54.950 回答
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 的集合。它只是一个“迭代器提供者”,甚至只有一个字符串(我们不能从字符串中删除字符,字符串是不可变的)。

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

于 2013-03-08T14:49:08.807 回答