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
相关产品推荐
相关产品推荐

