1. 程式人生 > >學習java筆記 --- 一個實現Iterable介面的小范例

學習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)
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 + "]";
	}

	
}
然後在main方法中,一個一個地呼叫下面方法

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