关于java:当我迭代它时,如何系统地清空一个可迭代对象?

How can I systematically empty an iterable object as I iterate through it?

本问题已经有最佳答案,请猛点这里访问。

我有一个方法,它获取具有未知类型t的任何不可迭代对象类型,并通过循环从中提取项,并将其放入另一个数据结构中。我需要删除旧的iterable对象中的每个项目,这样我就可以按排序顺序重新添加项目。

循环后,我尝试在对象上使用.clear(),但不能保证有一个清晰的方法。那么,我如何在浏览过程中删除项目,或者可能创建一个具有相同类型但没有值的新对象,这样我就可以在只知道对象是Iterable的情况下,向它重新添加所有内容?

1
2
3
4
5
6
7
8
9
10
11
12
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();
  }
}


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

1
2
3
4
5
6
    Iterator<K> iter = list.iterator();
    while (iter.hasNext()) {
        K item = iter.next();
        queue.insert(item, null);
        iter.remove();
    }

请记住,不是每一个EDCOX1 0实现都支持对象移除(例如,只读集合不会)。


所有的收藏都是iTerables,但事实并非如此。因此,您甚至不能期望从产生迭代器项的数据源中删除某些内容总是有意义的。就像这个非常复杂的Hello World示例:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
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。它只是一个"迭代器提供者",甚至只有一个字符串(我们不能从字符串中删除字符,字符串是不可变的)。

因此,不能"清除任何iterable",并且不是每个迭代器都支持移除项。


必须使用迭代器遍历列表。迭代器支持移除方法。