zoukankan      html  css  js  c++  java
  • 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

  • 相关阅读:
    Android Wear(手表)开发
    Android 中文件类型与MIME的匹配表
    匹配字符串-好技能-正则表达式
    正则表达式匹配字符串
    如何开发Android Wear应用程序
    【转】 hive安装配置及遇到的问题解决
    Hadoop项目开发环境搭建(EclipseMyEclipse + Maven)
    MapReduce 开发环境搭建(EclipseMyEclipse + Maven)
    hive权威安装出现的不解错误!(完美解决)两种方法都可以
    Hive项目开发环境搭建(EclipseMyEclipse + Maven)
  • 原文地址:https://www.cnblogs.com/deltadeblog/p/9032746.html
Copyright © 2011-2022 走看看