迭代输出(Iterator、ListIterator、Enumeration、foreach)

目录


Iterator

对数据只进行一次正向循环输出。
在这里插入图片描述

常用方法:

方法 说明
public boolean hasNext() 判断下一个数据是否为空
default void remove() 删除数据(很难用到)
public E next() 获取当前数据

示例:

List<String> list = new ArrayList<>();
        list.add("1");
        list.add("3");
        list.add("5");
        list.add("7");
        list.add("9");
        list.add("2");
        list.add("4");
        list.add("6");
        list.add("8");
        list.add("10");
        Iterator<String> iterator = list.iterator();
        while (iterator.hasNext()) {	//判断下一个数据是否为空
            String value = iterator.next();		//获取当前数据
            if ("3".equals(value)) {
                iterator.remove();	//删除数据,不会影响节点
            } else {
                System.out.println(value);
            }
        }

结果:

1
5
7
9
2
4
6
8
10

List、Set、Collection之中,List有get()方法,可以根据索引获取数据。
迭代器输出和List的get()方法:使用get()方法在输出时每一次都需要进行索引数据的匹配,时间复杂度(n+1)n,性能不强

ListIterator(双向迭代输出)

可以对数据顺序输出、也可以对数据逆向输出。

ListIterator在内部存在一个操作的指针想要逆向输出,必须指针到达之后一个数据,在可以逆向输出,所以想要逆向输出,必须先进行正向输出。
在这里插入图片描述

常用方法:

方法 说明
public boolean hasPrevious() 判断上一个数据是否为空
public E previous(); 获取数据

示例:

List<String> list = new ArrayList<>();
        list.add("a");
        list.add("c");
        list.add("b");
        list.add("m");
        list.add("a");
        list.add("d");
        list.add("g");
        list.add("j");
        list.add("l");
        list.add("q");
        ListIterator<String> listIterator = list.listIterator();
        System.out.print("正向输出:");
        while (listIterator.hasNext()) {
            System.out.print(listIterator.next() + "、");
        }
        System.out.print("\n反向输出:");
        while (listIterator.hasPrevious()) {
            System.out.print(listIterator.previous() + "、");
        }

结果:

正向输出:a、c、b、m、a、d、g、j、l、q、
反向输出:q、l、j、g、d、a、m、b、c、a、

Enumeration

早期的迭代输出器,现在只有Vector可以用到。
在这里插入图片描述
常用方法:

方法 说明
public boolean hasMoreElements() 判断下一个数据是否为空
public E nextElement() 获取当前数据

示例:

 Vector<String> vector = new Vector<>();
        vector.add("a");
        vector.add("b");
        vector.add("c");
        vector.add("d");
        vector.add("e");
        vector.add("f");
        Enumeration<String> enumeration = vector.elements();
        while(enumeration.hasMoreElements()){
            System.out.println(enumeration.nextElement());
        }

结果:

a
b
c
d
e
f

foreach

foreach循环输出,当自定义类对象要输出时,必须实现Iterable接口,在重写的iterator方法中返回一个iterator实例对象,所以必须在内部定义内部类实现Iterator接口。

在这里插入图片描述

示例: 自定义类输出

public class Demo01 {
    public static void main(String[] args) {
        Ball ball = new Ball();
        for (String b:ball) {
            System.out.print(b+"、");
        }
    }
}
class Ball implements Iterable<String>{
    private String[] brand = new String[]{"Hello","World"};
    private int footer;

    @Override
    public Iterator<String> iterator() {
        return new BallIter();
    }

    private class BallIter implements Iterator<String>{

        @Override
        public boolean hasNext() {
            //表示数组存在数据
            return Ball.this.footer < Ball.this.brand.length;
        }

        @Override
        public String next() {
            //返回数据
            return brand[Ball.this.footer++];
        }
    }
}

结果:

Hello、World、

示例: 自定义链表foreach输出

public class Demo02 {
    public static void main(String[] args) {
        ILink<String> link = new LinkImpl<>();
        link.add("1");
        link.add("2");
        for (String str:link) {
            System.out.println(str+"、");
        }
    }
}
interface ILink<T> extends Iterable<T>{
    /**
     *链表数据增加
     * @param data 数据
     */
    public void add(T data);
}
class LinkImpl<T> implements ILink<T>{
    private Node root;
    private Node<T> last;
    private Node currentNode;

    @Override
    public Iterator<T> iterator() {
        this.currentNode = this.root;
        return new LinkIter<>();
    }

    private static class Node<T>{
        private T data;
        private Node next;

        public Node() {

        }

        public Node(T data) {
            this.data = data;
        }
    }
    @Override
    public void add(T data) {
        Node<T> node = new Node<>(data);
        if(this.root == null){
            this.root = node;
        }else{
            this.last.next = node;
        }
        this.last = node;
    }

    private class LinkIter<T> implements Iterator<T>{

        @Override
        public boolean hasNext() {
            return LinkImpl.this.currentNode!=null;
        }

        @Override
        public T next() {
            T data = (T) LinkImpl.this.currentNode.data;
            LinkImpl.this.currentNode = LinkImpl.this.currentNode.next;
            return data;
        }
    }
}

结果:

12
发布了61 篇原创文章 · 获赞 0 · 访问量 2181

猜你喜欢

转载自blog.csdn.net/sabstarb/article/details/104602390