概述
在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:实现无限循环迭代器所遇到的程序开发问题。
如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。
本图文内容来源于网友提供,作为学习参考使用,或来自网络收集整理,版权属于原作者所有。
发表评论 取消回复