學習java筆記 --- 一個實現Iterable介面的小范例
以下的文件摘自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語句來遍歷所有相關的物件了
像這樣的用法:
String[] s ={"a","b","c"};
for (String ss : s) {
System.out.println("ss: "+ss);
}
Iterable<T>不過,像一般自定義的類和其例項物件,想要使用for each語句來遍歷它本身集體的話,可能就要實現Iterable<T>介面了。
像以下的程式碼:
(code1)
package cn.yang.collection; import java.util.Iterator; /** * 實現Iterable<E>介面的Person類 * @author yangqinjiang * */ public class Person implements Iterable<Person>{ /** * 實現Iterable介面中要求實現的方法 */ @Override public Iterator<Person> iterator() { return new MyIterator();//返回一個MyIterator例項物件 } /** * MyIterator是內部類,實現了Iterator<E>介面的類 * 像這樣的內部類,在網路上有很多這樣的寫法,我這裡只是參考他們的寫法罷了 * @author yangqinjiang * */ class MyIterator implements Iterator<Person>{ /**相當於索引*/ private int index =0; @Override public boolean hasNext() { //只要在呼叫next()後,index自加,確保index不等於person的長度 return index!=person.length; } @Override public Person next() { //使用索引來獲取person陣列中的某一項 return person[index++]; } @Override public void remove() { //未實現這個方法 } } private String name; private int age; /**person陣列,是目標操作物件*/ private Person[] person; /**為了方便簡單點,故寫一個這樣的構造方法*/ public Person(int size){ person=new Person[size]; for (int i = 0; i < size; i++) { person[i]=new Person(""+i, i); } } public void add(Person person){ //未實現這個方法 } public Person(){ //未實現這個方法 } public Person(String name,int age){ this.name=name; this.age=age; } //getter public String getName() { return name; } public void setName(String name) { this.name = name; } public int getAge() { return age; } public void setAge(int age) { this.age = age; } @Override public String toString() { return "person [name=" + name + ", age=" + age + "]"; } }
(code2)
然後在main方法中,一個一個地呼叫下面方法package cn.yang.collection; import java.util.ArrayList; import java.util.Iterator; import java.util.List; /** * 實現Iterable<E>介面的Person2類 * @author yangqinjiang * */ public class Person2 implements Iterable<Person2>{ /** * 實現Iterable介面中要求實現的方法 */ @Override public Iterator<Person2> iterator() { return new MyIterator();//返回一個MyIterator例項物件 } /** * MyIterator是內部類,實現了Iterator<E>介面的類 * 像這樣的內部類,在網路上有很多這樣的寫法,我這裡只是參考他們的寫法罷了 * @author yangqinjiang * */ class MyIterator implements Iterator<Person2>{ /**相當於索引,不過不是陣列索引*/ private int index =0; @Override public boolean hasNext() { return index!=person.size(); } @Override public Person2 next() { return person.get(index++); } @Override public void remove() { } } private String name; private int age; /**在Person2類中,person是一個數組連結串列*/ private List<Person2> person=new ArrayList<Person2>(); /**新增一個新Person2例項物件到person連結串列中*/ public void add(Person2 person2){ this.person.add(person2); } public Person2(){ } public Person2(String name,int age){ this.name=name; this.age=age; } public String getName() { return name; } public void setName(String name) { this.name = name; } public int getAge() { return age; } public void setAge(int age) { this.age = age; } @Override public String toString() { return "person [name=" + name + ", age=" + age + "]"; } }
(code3)
/**
* 使用"for each" 迴圈,可以列印陣列
*/
private static void printStrings() {
System.out.println("printStrings() method running");
String[] s ={"d","f","s"};
for (String ss : s) {
System.out.println("ss: "+ss);
}
System.out.println("printStrings() method end\n");
}
輸出結果:
printStrings() method running
ss: d
ss: f
ss: s
printStrings() method end
(code4)
System.out.println("testPerson() method running");
Person y1=new Person("1", 1);
Person y2=new Person("2", 2);
Person y3=new Person("3", 3);
Person y4=new Person("4", 4);
Person y5=new Person("5", 5);
//陣列
Person y[]={y1,y2,y3,y4,y5};
for (Person ys : y) {
System.out.println(ys.getName());
}
//Iterator
System.out.println("Iterator<Person>...");
Iterator<Person> i = new Person(10).iterator();
while(i.hasNext()){
System.out.println(i.next().toString());
}
//也可以這樣列印
System.out.println("other...");
Person yy=new Person(20);
for (Person ys : yy) {
System.out.println(ys.toString());
}
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)
System.out.println("testPerson2() method running");
Person2 p = new Person2("300", 300);
Person2 p1 = new Person2("30", 30);
Person2 p2 = new Person2("40", 40);
Person2 p3 = new Person2("50", 50);
Person2 p4 = new Person2("60", 60);
Person2 p5 = new Person2("70", 70);
p.add(p1);
p.add(p2);
p.add(p3);
p.add(p4);
p.add(p5);
//Iterator
Iterator<Person2> ii=p.iterator();
while (ii.hasNext()) {
System.out.println("Person2: "+ii.next().toString());
}
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,五四青年節喲,為何學校不放假?呀,五一才過了不久,又想著放五四節了》》其實在大學裡,可以把每天當成週末的啦。光陰似箭啊,珍惜