可迭代的集合类型使用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);}
原文地址:https://www.cnblogs.com/LZYY/p/3398692.html