一直搞不太清楚Iterable和Iterator
决定花点时间研究和整理下
从英文意思去理解
Iterable :故名思议,实现了这个接口的集合对象支持迭代,是可迭代的。able结尾的表示 能…样,可以做…。
Iterator: 在英语中or 结尾是都是表示 …样的人 or … 者。如creator就是创作者的意思。这里也是一样:iterator就是迭代者,我们一般叫迭代器,它就是提供迭代机制的对象,具体如何迭代,都是Iterator接口规范的。
Iterable
一个集合对象要表明自己支持迭代,能有使用foreach语句的特权,就必须实现Iterable接口,表明我是可迭代的!然而实现Iterable接口,就必需为foreach语句提供一个迭代器。
这个迭代器是用接口定义的 iterator方法提供的。也就是iterator方法需要返回一个Iterator对象。
//Iterable JDK源码
//可以通过成员内部类,方法内部类,甚至匿名内部类去实现Iterator
public interface Iterable<T>
{
Iterator<T> iterator();
}
Iterator
包含3个方法: hasNext , next , remove。remove按需求实现,一般它很少用到,以至于Eclipse接口方法自动补全时,都忽略了remove放方法。
1、每次在迭代前 ,先调用hasNext()探测是否迭代到终点(本次还能再迭代吗?)。
2、next方法不仅要返回当前元素,还要后移游标cursor
3、remove()方法用来删除最近一次已经迭代出的元素
4、 迭代出的元素是原集合中元素的拷贝(重要)
5、配合foreach使用
//Iterator接口的JDK源码,注释为整理建议使用Iterator的正确姿势
public interface Iterator<E> {
boolean hasNext(); //每次next之前,先调用此方法探测是否迭代到终点
E next(); //返回当前迭代元素 ,同时,迭代游标后移
/*删除最近一次已近迭代出出去的那个元素。
只有当next执行完后,才能调用remove函数。
比如你要删除第一个元素,不能直接调用 remove() 而要先next一下( );
在没有先调用next 就调用remove方法是会抛出异常的。
这个和MySQL中的ResultSet很类似
*/
void remove()
{
throw new UnsupportedOperationException("remove");
}
}
/**
*
*/
import java.util.ArrayList;
import java.util.Iterator;
import java.util.List;
/**
* @author lenovo
*
*/
public class Algotithms implements Iterable<Algorithm>{
private Algorithm[] als;
private List<String> alInfo;
/**
*
*/
public Algotithms(Algorithm[] als) {
alInfo = new ArrayList<String>();
// TODO Auto-generated constructor stub
this.als = als;
}
/* (non-Javadoc)
* @see java.lang.Iterable#iterator()
*/
public Iterator<Algorithm> iterator() {
// TODO Auto-generated method stub
return new AlgorithmIterator();
}
private class AlgorithmIterator implements Iterator<Algorithm>{
private int index = 0;
private int cursor = -1;
/* (non-Javadoc)
* @see java.util.Iterator#hasNext()
*/
public boolean hasNext() {
// TODO Auto-generated method stub
return cursor != als.length;
}
/* (non-Javadoc)
* @see java.util.Iterator#next()
*/
public Algorithm next() {
// TODO Auto-generated method stub
Algorithm temp = als[index++];
cursor += 1;
return temp;
}
/* (non-Javadoc)
* @see java.util.Iterator#remove()
*/
public void remove() {
// TODO Auto-generated method stub
}
}
public List<String> ergAlInfo(){
for (Algorithm al : als){
}
return alInfo;
}
}
要使用foreach,集合类是需要实现IEnumerator接口的类
for(A a :aList)