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

时间:2023-01-12 09:02:20

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