You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何实现返回每个数组元素两次的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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.09.30 06:15:03