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

Java中如何让自定义类实现Iterable接口以支持foreach循环遍历

你需要自定义一个实现Iterator<R>接口的内部类,用来遍历当前链表的节点,修改后的LinkedList.java代码如下:

package app;
import java.util.Iterator;
import java.util.NoSuchElementException;

public class LinkedList<R> implements Iterable<R>{
    private Node<R> headNode;

    public void addNode(Node<R> nR){
        if(headNode == null){
            headNode = nR;
        } else {
            nR.setNextNode(headNode);
            this.headNode = nR;
        }
    }

    public void addData(R dR){
        Node<R> nR = new Node<>(dR);
        addNode(nR);
    }

    public LinkedList(){
        headNode = null;
    }

    @Override
    public Iterator<R> iterator() {
        // 返回自定义的Iterator实例
        return new LinkedListIterator();
    }

    // 自定义Iterator内部类
    private class LinkedListIterator implements Iterator<R> {
        // 记录当前遍历到的节点
        private Node<R> currentNode = headNode;

        @Override
        public boolean hasNext() {
            // 当前节点不为空说明还有元素可以遍历
            return currentNode != null;
        }

        @Override
        public R next() {
            if (!hasNext()) {
                throw new NoSuchElementException();
            }
            // 取出当前节点的数据
            R data = currentNode.getData();
            // 指针后移一位
            currentNode = currentNode.getNextNode();
            return data;
        }

        @Override
        public void remove() {
            // 不需要实现删除逻辑的话直接抛不支持操作异常
            throw new UnsupportedOperationException();
        }
    }
}

修改后就可以正常使用foreach遍历自定义链表了,你可以在main方法末尾添加测试代码验证:

for (Integer num : u) {
    System.out.println(num);
}

由于你的add方法是头插法,输出顺序会是插入顺序的倒序,也就是7 5 11 8 9 3,如果需要正序输出可以调整add方法的插入逻辑改为尾插即可。

内容的提问来源于stack exchange,提问作者Reza Esmaeelzade

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.25 01:54:07