学习java笔记 --- 一个实现Iterable<E>接口的小范例

from:http://blog.csdn.net/yangqinjiang/article/details/7536005


以下的文档摘自JDK 5.0文档说明

java.lang

接口 Iterable<T>

public interface Iterable<T>

实现这个接口允许对象成为 "foreach" 语句的目标。


方法摘要
Iterator<T>iterator() 
返回一个在一组 T 类型的元素上进行迭代的迭代器。

方法详细信息

iterator

Iterator<T> iterator()
返回一个在一组 T 类型的元素上进行迭代的迭代器。
返回:

一个迭代器。


=============================================

以下的文字不是摘自JDK 5.0文档


其中上面有说明了,实现这个接口允许对象成为 "foreach" 语句的目标。这样就可以类似使用数组那样,用foreach语句来遍历所有相关的对象了

像这样的用法:

[java]  view plain copy
  1. String[] s ={"a","b","c"};  
  2. for (String ss : s) {  
  3.     System.out.println("ss: "+ss);  
  4. }  
Iterable<T>
不过,像一般自定义的类和其实例对象,想要使用for each语句来遍历它本身集体的话,可能就要实现Iterable<T>接口了。

像以下的代码:

(code1)

[java]  view plain copy
  1. package cn.yang.collection;  
  2.   
  3. import java.util.Iterator;  
  4.   
  5. /** 
  6.  * 实现Iterable<E>接口的Person类 
  7.  * @author yangqinjiang 
  8.  * 
  9.  */  
  10. public class Person implements Iterable<Person>{  
  11.   
  12.   
  13.     /** 
  14.      * 实现Iterable接口中要求实现的方法 
  15.      */  
  16.     @Override  
  17.     public Iterator<Person> iterator() {  
  18.         return new MyIterator();//返回一个MyIterator实例对象  
  19.     }  
  20.       
  21.     /** 
  22.      * MyIterator是内部类,实现了Iterator<E>接口的类 
  23.      * 像这样的内部类,在网络上有很多这样的写法,我这里只是参考他们的写法罢了 
  24.      * @author yangqinjiang 
  25.      * 
  26.      */  
  27.     class MyIterator implements Iterator<Person>{  
  28.   
  29.         /**相当于索引*/  
  30.         private int index =0;  
  31.         @Override  
  32.         public boolean hasNext() {  
  33.             //只要在调用next()后,index自加,确保index不等于person的长度  
  34.             return index!=person.length;  
  35.         }  
  36.   
  37.         @Override  
  38.         public Person next() {  
  39.             //使用索引来获取person数组中的某一项  
  40.             return person[index++];  
  41.         }  
  42.   
  43.         @Override  
  44.         public void remove() {  
  45.             //未实现这个方法  
  46.         }  
  47.           
  48.     }  
  49.   
  50.       
  51.     private String name;  
  52.     private int age;  
  53.     /**person数组,是目标操作对象*/  
  54.     private Person[] person;  
  55.       
  56.     /**为了方便简单点,故写一个这样的构造方法*/  
  57.     public Person(int size){  
  58.         person=new Person[size];  
  59.         for (int i = 0; i < size; i++) {  
  60.             person[i]=new Person(""+i, i);  
  61.         }  
  62.     }  
  63.       
  64.     public void add(Person person){  
  65.         //未实现这个方法  
  66.     }  
  67.       
  68.     public Person(){  
  69.         //未实现这个方法  
  70.     }  
  71.       
  72.     public Person(String name,int age){  
  73.         this.name=name;  
  74.         this.age=age;  
  75.     }  
  76.       
  77.     //getter  
  78.     public String getName() {  
  79.         return name;  
  80.     }  
  81.     public void setName(String name) {  
  82.         this.name = name;  
  83.     }  
  84.     public int getAge() {  
  85.         return age;  
  86.     }  
  87.     public void setAge(int age) {  
  88.         this.age = age;  
  89.     }  
  90.     @Override  
  91.     public String toString() {  
  92.         return "person [name=" + name + ", age=" + age + "]";  
  93.     }  
  94.   
  95.       
  96. }  

(code2)

[java]  view plain copy
  1. package cn.yang.collection;  
  2.   
  3. import java.util.ArrayList;  
  4. import java.util.Iterator;  
  5. import java.util.List;  
  6.   
  7. /** 
  8.  * 实现Iterable<E>接口的Person2类 
  9.  * @author yangqinjiang 
  10.  * 
  11.  */  
  12. public class Person2 implements Iterable<Person2>{  
  13.   
  14.   
  15.     /** 
  16.      * 实现Iterable接口中要求实现的方法 
  17.      */  
  18.     @Override  
  19.     public Iterator<Person2> iterator() {  
  20.         return new MyIterator();//返回一个MyIterator实例对象  
  21.     }  
  22.       
  23.     /** 
  24.      * MyIterator是内部类,实现了Iterator<E>接口的类 
  25.      * 像这样的内部类,在网络上有很多这样的写法,我这里只是参考他们的写法罢了 
  26.      * @author yangqinjiang 
  27.      * 
  28.      */  
  29.     class MyIterator implements Iterator<Person2>{  
  30.         /**相当于索引,不过不是数组索引*/  
  31.         private int index =0;  
  32.         @Override  
  33.         public boolean hasNext() {  
  34.             return index!=person.size();  
  35.         }  
  36.   
  37.         @Override  
  38.         public Person2 next() {  
  39.             return person.get(index++);  
  40.         }  
  41.   
  42.         @Override  
  43.         public void remove() {  
  44.               
  45.         }  
  46.           
  47.     }  
  48.   
  49.       
  50.     private String name;  
  51.     private int age;  
  52.     /**在Person2类中,person是一个数组链表*/  
  53.     private List<Person2> person=new ArrayList<Person2>();  
  54.       
  55.     /**添加一个新Person2实例对象到person链表中*/  
  56.     public void add(Person2 person2){  
  57.         this.person.add(person2);  
  58.     }  
  59.       
  60.     public Person2(){  
  61.           
  62.     }  
  63.       
  64.     public Person2(String name,int age){  
  65.         this.name=name;  
  66.         this.age=age;  
  67.           
  68.     }  
  69.     public String getName() {  
  70.         return name;  
  71.     }  
  72.     public void setName(String name) {  
  73.         this.name = name;  
  74.     }  
  75.     public int getAge() {  
  76.         return age;  
  77.     }  
  78.     public void setAge(int age) {  
  79.         this.age = age;  
  80.     }  
  81.     @Override  
  82.     public String toString() {  
  83.         return "person [name=" + name + ", age=" + age + "]";  
  84.     }  
  85.   
  86.       
  87. }  
然后在main方法中,一个一个地调用下面方法

(code3)

[java]  view plain copy
  1. /** 
  2.  * 使用"for each" 循环,可以打印数组 
  3.  */  
  4. private static void printStrings() {  
  5.     System.out.println("printStrings() method running");  
  6.     String[] s ={"d","f","s"};  
  7.     for (String ss : s) {  
  8.         System.out.println("ss: "+ss);  
  9.     }  
  10.     System.out.println("printStrings() method end\n");  
  11. }  

输出结果:

printStrings() method running
ss: d
ss: f
ss: s
printStrings() method end


(code4)

[java]  view plain copy
  1. System.out.println("testPerson() method running");  
  2.           
  3.         Person y1=new Person("1"1);  
  4.         Person y2=new Person("2"2);  
  5.         Person y3=new Person("3"3);  
  6.         Person y4=new Person("4"4);  
  7.         Person y5=new Person("5"5);  
  8.         //数组  
  9.         Person y[]={y1,y2,y3,y4,y5};  
  10.         for (Person ys : y) {  
  11.             System.out.println(ys.getName());  
  12.         }  
  13.   
  14.         //Iterator  
  15.         System.out.println("Iterator<Person>...");  
  16.         Iterator<Person> i = new Person(10).iterator();  
  17.         while(i.hasNext()){  
  18.             System.out.println(i.next().toString());  
  19.         }  
  20.           
  21.         //也可以这样打印  
  22.         System.out.println("other...");  
  23.         Person yy=new Person(20);  
  24.           
  25.         for (Person ys : yy) {  
  26.             System.out.println(ys.toString());  
  27.         }  
  28.         System.out.println("testPerson() method end\n");  

输出结果:

testPerson() method running
1
2
3
4
5
Iterator<Person>...
person [name=0, age=0]
...
person [name=9, age=9]
other...
person [name=0, age=0]
...
person [name=19, age=19]
testPerson() method end


(code5)

[java]  view plain copy
  1. System.out.println("testPerson2() method running");  
  2.           
  3.         Person2 p = new Person2("300"300);  
  4.         Person2 p1 = new Person2("30"30);  
  5.         Person2 p2 = new Person2("40"40);  
  6.         Person2 p3 = new Person2("50"50);  
  7.         Person2 p4 = new Person2("60"60);  
  8.         Person2 p5 = new Person2("70"70);  
  9.         p.add(p1);  
  10.         p.add(p2);  
  11.         p.add(p3);  
  12.         p.add(p4);  
  13.         p.add(p5);  
  14.         //Iterator  
  15.         Iterator<Person2> ii=p.iterator();  
  16.         while (ii.hasNext()) {  
  17.             System.out.println("Person2:  "+ii.next().toString());  
  18.         }  
  19.         System.out.println("testPerson2() method end\n");  

输出结果:

testPerson2() method running
Person2:  person [name=30, age=30]
Person2:  person [name=40, age=40]
Person2:  person [name=50, age=50]
Person2:  person [name=60, age=60]
Person2:  person [name=70, age=70]
testPerson2() method end

总结:很明显,实现这个接口允许对象成为 "foreach" 语句的目标。(呵呵,拿这句话来当成总结吧)



20120504,五四青年节哟,为何学校不放假?呀,五一才过了不久,又想着放五四节了》》其实在大学里,可以把每天当成周末的啦。光阴似箭啊,珍惜


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值