无意中在网上看到一篇文章,把作者的想法进行了实现并进行了改进。
原文地址http://my.oschina.net/u/1412027/blog/226376
原文内容:
从Java5起,在Java中有了for-each循环,可以用来循环遍历collection和array。For each循环允许你在无需保持传统for循环中的索引,或在使用iterator /ListIterator时无需调用while循环中的hasNext()方法就能遍历collection。Java中,for-each循环简化了任何Collection或array的遍历过程,但并不是每个Java程序员都了解本文将要描述的for-each 循环的一些细节。与 Java5 发布的其他术语:释放别名泛型,自动封装和可变参数不同,Java开发者对for-each循环的使用比任何其他特性更加频...
对作者的想法的实现,并且增加了反向遍历
package thinkInJavaChapter14;
import java.util.ArrayList;
import java.util.Iterator;
/**
*
* @author Administrator
*
*/
public class ForEachTest
{
/**
* 用来测试自定义类使用foreach循环
* @author Administrator
*
* @param <T>
*/
class CustomCollection<T> implements Iterable<T>{
/**
*
*/
private ArrayList<T> bucket;
public CustomCollection(){
bucket = new ArrayList<T>();
}
public int size() {
return bucket.size();
}
public boolean isEmpty() {
return bucket.isEmpty();
}
public boolean contains(T o) {
return bucket.contains(o);
}
public boolean add(T e) {
return bucket.add(e);
}
public boolean remove(T o) {
return bucket.remove(o);
}
@Override
public Iterator<T> iterator()
{
return new Iterator<T>()
{
private int nn = 0;
public boolean hasNext(){
return nn!=bucket.size();
}
public T next(){
return bucket.get(nn++);
//return bucket;
}
@Override
public void remove()
{
throw new UnsupportedOperationException();
}
};
}
//反向输出
public Iterable<T> revese(){
/**
*
*/
return new Iterable<T>()
{
public Iterator<T> iterator(){
return new Iterator<T>()
{
int index = bucket.size()-1;
@Override
public boolean hasNext()
{
// TODO Auto-generated method stub
return index>-1;
}
@Override
public T next()
{
return bucket.get(index--);
}
@Override
public void remove()
{
throw new UnsupportedOperationException();
}
};
}
};
}
}
public static void main(String args[]){
ForEachTest f = new ForEachTest();
CustomCollection<String> myCollection = f.new CustomCollection<String>();
myCollection.add("1");
myCollection.add("2");
myCollection.add("3");
//What does this code will do, print language, throw exception or compile time error
for(String language: myCollection){
System.out.println(language.toString());
}
System.out.println("**********************");
for(String language: myCollection.revese()){
System.out.println(language.toString());
}
}
}