如何使用Iterator遍历列表交替元素(不修改while循环)
实现交替遍历的解决方案
当然可以!不用动你现有的while循环半行代码,只需要给原迭代器加个“包装器”,让它自动跳过不需要的元素就行。
核心思路是自定义一个迭代器,把原来的迭代器包在里面,重写next()方法——每次调用时,先返回当前元素,再自动跳过下一个元素(如果有的话)。这样你的while循环还是调用hasNext()和next(),但拿到的就是交替的元素了。
具体代码实现
先写这个自定义的包装迭代器:
import java.util.Iterator; class SkipIterator<T> implements Iterator<T> { private final Iterator<T> originalIterator; public SkipIterator(Iterator<T> iterator) { this.originalIterator = iterator; } @Override public boolean hasNext() { return originalIterator.hasNext(); } @Override public T next() { // 先获取当前要返回的元素 T current = originalIterator.next(); // 如果还有下一个元素,就跳过它 if (originalIterator.hasNext()) { originalIterator.next(); } return current; } }
然后修改你原来代码里获取迭代器的那一行,其他代码完全不动:
List<Integer> list = Arrays.asList(1, 2, 3, 4, 5, 6); // 替换原迭代器为我们的包装迭代器 Iterator<Integer> it = new SkipIterator<>(list.iterator()); while (it.hasNext()) { System.out.println(it.next()); }
效果说明
运行这段代码,输出就是1、3、5,完全符合你的要求。而且不管列表长度是奇数还是偶数,都能正常工作:如果列表是[1,2,3,4,5],最后会输出1、3、5;如果是[1,2,3],输出1、3。
这种方法的好处就是完全遵循了你的要求——原while循环一行都不用改,所有逻辑都封装在自定义迭代器里,符合开闭原则。
内容的提问来源于stack exchange,提问作者Randhir
相关产品推荐
相关产品推荐

