• 可迭代的集合类型使用foreach语句


          在学习算法这本书图论那一部分的时候,接触到了几个类似for(int w:G.adj(v)),的语句,不是很理解,就去百度,发现这是一种叫做foreach的语法,在书的76页有讲到,但是之前没认真看书,下面是有关我的foreach学习笔记:

     

          foreach用于访问一个集合内的所有元素,适用于遍历数组和集合类。注意foreach不是关键字,书上对foreach的解释的大概意思是:可以将该fo语句看做是对于集合中的每个元素,执行以下的代码。它不需要知道集合的具体细节,只是处理集合中的每一个元素。

     

    foreach的大概格式是;

    for(元素类型t 元素变量x : 遍历对象obj){

         引用了x的java语句;

    }

     

    通过举例子,或许会更加了解foreach:

     


     

    在一维数组中使用:

    int array[ ] = {1,2,3,4};
    for(int x : array)   //比平常的写法要简单
    {
        System.out.println("x");
    }

    在二维数组中的使用:

    int array[ ][ ] = { {4,3},{1,2}}   //类似也可以写3维数组
    for(int x[ ] ;array){            
        for(int b ; x){
            System.out.println("e");
        }
    }

         

          不过foreach语句应该更多在遍历集合类型,且集合类型是要求可迭代的,即要求实现Iterable<T>接口,算法书上的Stack ,Queue以及Bag都有实现iterable接口,并返回一个Iterator对象。

         其中Iterator类必须包括两个方法:

        1.hasNext(),返回一个布尔值。

        2.next(),返回集合中的一个元素。

     

        这里贴一个Bag的代码:

    import java.util.Iterator;           
    public class Bag<Item>  implements Iterable<Item>{
        private Node first;     
        private int N;
        private class Node
        {
            Item item;
            Node next;
        }
        public void add(Item item)
        {
            //和Stack的push方法一样
            Node oldfirst = first;
            first = new Node();
            first.item = item;
            first.next = oldfirst;
            N++;
        }
        //这里实现了接口并且重写了俩方法
        private class ListIterator implements Iterator<Item>
        {
            private Node current = first;
            public boolean hasNext()    //检测currents是否为空
            {return current != null;}
            public void remove(){};
            public Item next()
            {
                Item item = current.item;
                current = current.next;     //实例变量来记录当前节点
                return item ;    
            }
        }
        //返回了一个iterabor对象
        public Iterator<Item> iterator()
        {    //
            return new ListIterator();
        }
    }

    实现了iterator接口并重写了那俩方法后,之后就可以用foreach语句了,例子如下:

    Bag<Transaction> collection = new Bag<Transaction>;//在Bag中维护一个可交易集合,和书上的类似
    //此处省略具体实现代码......................;
    for(Transaction t : collection)
    { System.out.println(t);}
  • 相关阅读:
    什么是IO多路复用
    Coursera, Machine Learning, Unsupervised Learning, K-means, Dimentionality Reduction
    Coursera, Machine Learning, SVM
    ShareSDK
    iOS JS和OC交互
    iOS KVO 常见错误
    第三方框架之SDWebImage
    单例存储账号
    UIRefreshControl
    二维码扫描
  • 原文地址:https://www.cnblogs.com/LZYY/p/3398692.html
Copyright © 2020-2023  润新知