在学习算法这本书图论那一部分的时候,接触到了几个类似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);}