我是靠谱客的博主 端庄台灯,最近开发中收集的这篇文章主要介绍Java:实现无限循环迭代器,觉得挺不错的,现在分享给大家,希望可以做个参考。

概述

在Java中,正常的迭代器是有始有终的。
但是在实际应用中,我们有时候很可能需要的不只是迭代一遍,而是无限循环迭代,例如实现图片轮播、音乐列表轮播等等。
为了开发方便,于是就有了这么一个需求:我们需要一个可以无限循环迭代的迭代器。
实现的原理就像把一个集合头尾相接形成环形,让它可以无限地遍历到下一个元素。

我把这个迭代器起名为LoopIterator,Loop是环形的意思。

废话不多说,上代码:

import com.sun.istack.internal.NotNull;

import java.util.*;

/**
 * 无限循环迭代器
 * 2022/2/18
 *
 * @author Rex Chou
 * @version 1.0
 */
public class LoopIterator<E> implements ListIterator<E> {

    public LoopIterator(@NotNull List<E> list) {
        this.list = list;
        iterator = list.listIterator();
    }

    private List<E> list;

    private ListIterator<E> iterator;

    /**
     * 获取下一个元素
     *
     * @return
     */
    @Override
    public E next() {

        // 如果游标到达末位,就替换成新的迭代器,此时游标在首位
        if (iterator.hasNext() == false) {
            iterator = list.listIterator();
        }
        return iterator.next();
    }

    /**
     * 获取上一个元素
     *
     * @return
     */
    @Override
    public E previous() {

        // 如果游标到达首位,就把游标定位到末位
        if (iterator.hasPrevious() == false) {
            while (iterator.hasNext()) {
                iterator.next();
            }
        }
        return iterator.previous();
    }

    @Override
    public boolean hasNext() {
        return true;
    }

    @Override
    public boolean hasPrevious() {
        return true;
    }

    @Override
    public int nextIndex() {
        if (iterator.hasNext() == false) {
            return 0;
        } else {
            return iterator.nextIndex();
        }
    }

    @Override
    public int previousIndex() {
        if (iterator.hasPrevious() == false) {
            return list.size() - 1;
        } else {
            return iterator.previousIndex();
        }
    }

    @Override
    public void remove() {
        iterator.remove();
    }

    @Override
    public void set(E e) {
        iterator.set(e);
    }

    @Override
    public void add(E e) {
        iterator.add(e);
    }
    
}

接下来添加一个测试用的main方法,利用定时器来每秒输出下一个元素。

    /**
     * 测试
     *
     * @param args
     */
    public static void main(String[] args) {
        List<String> list = new ArrayList<>();
        list.add("星期一");
        list.add("星期二");
        list.add("星期三");
        list.add("星期四");
        list.add("星期五");
        list.add("星期六");
        list.add("星期日");

        LoopIterator<String> loopIterator= new LoopIterator<>(list);

        new Timer().schedule(new TimerTask() {
            @Override
            public void run() {
                System.out.println(loopIterator.next());
            }
        }, 100, 1000);
    }

实现无限循环的方式有N多种,为什么选择迭代器?

  • 众所周知,迭代器的性能比普通的遍历方式性能要好,LoopIterator仅仅使用新的逻辑来调用原生迭代器的方法,尽量保留了高性能。
  • 实现迭代器接口,使得方法使用起来得心应手。
  • 不用限制在一个循环代码块里,在其它地方根据不同的条件都可以继续遍历。

最后

以上就是端庄台灯为你收集整理的Java:实现无限循环迭代器的全部内容,希望文章能够帮你解决Java:实现无限循环迭代器所遇到的程序开发问题。

如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。

本图文内容来源于网友提供,作为学习参考使用,或来自网络收集整理,版权属于原作者所有。
点赞(41)

评论列表共有 0 条评论

立即
投稿
返回
顶部