學習java筆記 --- 一個實現Iterable介面的小范例

逸卿發表於2014-11-19

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 plaincopy
  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 plaincopy
  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 plaincopy
  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 plaincopy
  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 plaincopy
  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 plaincopy
  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,五四青年節喲,為何學校不放假?呀,五一才過了不久,又想著放五四節了》》其實在大學裡,可以把每天當成週末的啦。光陰似箭啊,珍惜


相關文章