【Java】Iterator接口方法及 独立类迭代器实现

本文深入解析Java中的Iterator接口,包括其三个核心方法:hasNext、next和remove的详细功能及使用场景。通过自定义实现SeparateIterator类,展示如何在实际项目中运用Iterator进行集合元素的迭代操作。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

接口实现:

Iterator接口包含三个方法:hasNext、next、remove。
迭代器的位置不是在某一个元素上,而是在集合中第一个元素之前、两个元素之间或最后一个元素之后。

public interface Iterator<T> {

    /**
     * Task:测定迭代器是否完成遍历并越过数据集的最后一个元素
     * @return 迭代器若有下一个元素返回 true
     */
    public boolean hasNext();

    /**
     * Task:提取集合中当前(下一个)元素 并迭代前进下一个位置
     * @return 迭代当前元素的引用
     * @throws java.util.NoSuchElementException 若迭代已经到头,则 hasNext()为false
     */
    public T next();

    /**
     * Task:从迭代器删除next()返回的下一个元素
     *      此后调用next()的行为将与删除前一样
     *   Precondition:next()已被调用,remove()尚未被调用
     *       数据集在迭代期间 除调用本方法外未被修改
     * @throws IllegalStateException 若next()未被调用
     * @throws UnsupportedOperationException 若迭代器不允许删除
     */
    public void remove();

}

独立类迭代器实现:

import java.util.ArrayList;
import java.util.NoSuchElementException;

/**
 * 独立类迭代器
 * @param <T>
 */
public class SeparateIterator<T> implements Iterator<T> {
    private ArrayList<T> list;
    private int nextPosition;   //next()返回最近元素的位置
    private boolean wasNextCalled;  //需要删除的

    public SeparateIterator(ArrayList<T> arrayList) {
        list=arrayList;
        nextPosition=0;          //用于跟踪迭代到何处
        wasNextCalled=false;     //用于检出是否首先调用了next()
    }

    @Override
    public boolean hasNext() {
        return nextPosition<list.size();
    }

    @Override
    public T next() {
        if(hasNext()) {
            wasNextCalled = true;     //设置为true,remove()方法可以调用next()
            nextPosition++;
            return list.get(nextPosition-1);   //由于先前移,故减一

        }
        else
            throw new NoSuchElementException("Illegal call to next();"+"iterator is after end of list!");
    }

    @Override
    public void remove() {
        if(wasNextCalled){
            list.remove(nextPosition);
            nextPosition--;
            wasNextCalled=false;
        }
        else
            throw new IllegalStateException("Illegal call to remove();"+"next() was not called!");
    }
}


测试:

注意调用SeparateIterator的构造函数将迭代器nameofGQT与线性表nameList连接起来。

import java.util.ArrayList;

public class Test {
    public static void main(String[] args){
        ArrayList<String> arrayList=new ArrayList<String>();
        arrayList.add("Ned");
        arrayList.add("John");
        arrayList.add("Robb");
        arrayList.add("Sansa");
        arrayList.add("Arya");
        arrayList.add("Bran");

        for (String s:arrayList) {    //输出
            System.out.println(s);
        }
        System.out.println();

        Iterator<String> nameofGQT=new SeparateIterator<String>(arrayList);      //调用SeparateIterator的构造函数把迭代器namwodGQT与arrayList连接在一起
//        while (nameofGQT.hasNext())
//            System.out.print(nameofGQT.next()+" ");  //用于测试,否则会抛出NoSuchElementException异常
//        System.out.println();
        nameofGQT.next();           //The old wolf is gone! Poor Ned!
//        while (nameofGQT.hasNext())
//            System.out.print(nameofGQT.next()+" ");  //用于测试,否则会报出NoSuchElementException异常
//        System.out.println();
        nameofGQT.next();
        nameofGQT.remove();      //The Young Wolf is dead!
        //nameofGQT.remove();  //出错,未先使用next(),报出IllegalStateException异常
        while (nameofGQT.hasNext())
            System.out.print(nameofGQT.next()+" ");

    }
}


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值