如何实现返回每个数组元素两次的Iterator迭代器方法
实现方案
我们可以通过自定义实现Iterator<Integer>接口完成需求,核心是维护两个状态来控制输出逻辑:
- 当前遍历到原数组的索引位置
- 当前索引对应的元素是否已经返回过1次
完整代码实现
import java.util.Iterator; import java.util.NoSuchElementException; public class ArrayIteratorUtil { public static Iterator<Integer> intArrayTwoTimesIterator(int[] array) { // 入参非空校验可按需调整 if (array == null) { throw new IllegalArgumentException("array cannot be null"); } return new Iterator<Integer>() { // 当前遍历到的数组下标 private int currentIndex = 0; // 标记当前元素是否已经输出过1次 private boolean isReturnedOnce = false; @Override public boolean hasNext() { // 下标未超出数组长度就还有可返回元素 return currentIndex < array.length; } @Override public Integer next() { if (!hasNext()) { throw new NoSuchElementException(); } int currentVal = array[currentIndex]; if (!isReturnedOnce) { // 第一次返回当前元素,标记状态,下标不变 isReturnedOnce = true; return currentVal; } else { // 第二次返回当前元素,重置状态,下标后移 isReturnedOnce = false; currentIndex++; return currentVal; } } @Override public void remove() { // 迭代器默认不支持移除操作,可按需实现 throw new UnsupportedOperationException(); } }; } }
效果验证代码
public static void main(String[] args) { int[] input = new int[]{1,2,3}; Iterator<Integer> iterator = intArrayTwoTimesIterator(input); StringBuilder sb = new StringBuilder("["); while (iterator.hasNext()) { sb.append(iterator.next()); if (iterator.hasNext()) { sb.append(", "); } } sb.append("]"); System.out.println(sb.toString()); // 输出结果:[1, 1, 2, 2, 3, 3] }
逻辑说明
hasNext()只判断当前下标是否在数组长度范围内,符合迭代器的规范要求next()通过标记位控制同一个元素返回两次:第一次返回后仅修改标记,下标保持不动;第二次返回后重置标记,下标移动到下一个元素- 额外添加了入参校验和无元素时的异常抛出,完全符合JDK中Iterator接口的约定
内容的提问来源于stack exchange,提问作者Petru Ciorba
相关产品推荐
相关产品推荐

