java 迭代

Posted Delta

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了java 迭代相关的知识,希望对你有一定的参考价值。

迭代器的作用是提供一种方法对一个容器对象中的各个元素进行访问,而又不暴露该对象容器的内部细节。

java中的很多容器都实现了Iterable接口,容器中的元素都是可以遍历的。

如下例,list容器中存储的是Integer对象,list可以返回一个Iterator对象用于遍历list中的元素。

        // list中存储的是Integer对象
        List<Integer> list = Arrays.asList(1,2,3,4,5);
        // 容器List实现了Iterable接口,也即实现了iterator()方法
        // 该方法可以生成一个迭代器遍历list中的元素
        Iterator<Integer> iterator = list.iterator();
        // 使用迭代器iterator遍历list中的每一个元素,并打印出来
        while(iterator.hasNext())
            System.out.print(iterator.next() + " ");

一种更为简洁的写法是:

        // list中存储的是Integer对象
        List<Integer> list = Arrays.asList(1,2,3,4,5);
// 遍历list中的每一个元素,并打印出来for (int x:list)
            System.out.print(x + " ");

 

迭代的实现


如果要写一个容器类,并使其具有迭代功能,该类应满足如下两个要求:

该类需继承Iterable接口,实现接口的iterator()方法;

定义一个实现Iterator接口的类,实现接口的hasNext()方法与next()方法。

 

如定义类Bag(背包)用于存储数据元素。

public class Bag<Item> {

    private class Node {
        Item item;
        Node next;
    }
    private Node first;
    private int N;

    public boolean isEmpty() {return N==0;}
    public int size() {return N;}

    public void add(Item item) {
        Node temp = new Node();
        temp.item = item;
        temp.next = first;
        first = temp;
    }

}

若要使容器Bag可迭代,Bag需要定义一个实现Iterator接口的类(BagIterator),该类中的hasNext()与next()方法可以帮助遍历元素。

    private class BagIterator implements Iterator<Item> {

        private Node current = first;
        @Override
        public boolean hasNext() {
            return current != null;
        }
        @Override
        public Item next() {
            Item temp = current.item;
            current = current.next;
            return temp;
        }
    }

Bag需要实现Iterable接口,改接口的Iterator()方法,可以返回一个上述的迭代器(BagIterator)

public class Bag<Item> implements Iterable<Item>

    @Override
    public Iterator<Item> iterator() {
        return new BagIterator();
    }

 

完整代码如下:

import java.util.Iterator;

public class Bag<Item> implements Iterable<Item>{

    private class Node {
        Item item;
        Node next;
    }
    private Node first;
    private int N;

    public boolean isEmpty() {return N==0;}
    public int size() {return N;}

    public void add(Item item) {
        Node temp = new Node();
        temp.item = item;
        temp.next = first;
        first = temp;
    }


    private class BagIterator implements Iterator<Item> {

        private Node current = first;
        @Override
        public boolean hasNext() {
            return current != null;
        }
        @Override
        public Item next() {
            Item temp = current.item;
            current = current.next;
            return temp;
        }
    }

    @Override
    public Iterator<Item> iterator() {
        return new BagIterator();
    }

}

 

测试如下:

    public static void main(String[] args) {

        Bag<Integer> bag = new Bag<>();
        bag.add(3);
        bag.add(2);
        bag.add(3);
        bag.add(1);

        for (int i:bag)
            System.out.println(i);
    }

输出结果:

1
3
2
3





以上是关于java 迭代的主要内容,如果未能解决你的问题,请参考以下文章

为啥我在这个 python 片段中得到 float 是不可迭代的? [复制]

如何在Django视图中使用for循环返回每次迭代[关闭]

如何在UL中迭代使用appendChild和片段LI?

java代码在片段活动中不起作用

java 代码片段【JAVA】

# Java 常用代码片段