How can I systematically empty an iterable object as I iterate through it?
本问题已经有最佳答案,请猛点这里访问。
我有一个方法,它获取具有未知类型t的任何不可迭代对象类型,并通过循环从中提取项,并将其放入另一个数据结构中。我需要删除旧的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循环,而是使用显式
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",并且不是每个迭代器都支持移除项。
必须使用迭代器遍历列表。迭代器支持移除方法。