1.迭代器設計
迭代器是一種模式,它可以使得對於序列型別的資料結構的遍歷行為與被遍歷的物件分離,即我們無需關心該序列的底層結構是什麼樣子的。
一般的迭代器對外提供的介面有:
[1]檢查是否至序列末端;
[2]返回當前的物件;
[3]過渡到下一個物件。
我們基於以上三點,提供一個迭代器Interface。
<<interface>>MyIterator.java
package com.zj.iterator;
public interface MyIterator<T> {
boolean end();
T current();
void next();
}
|
接下來,設計一個序列,並部署上面設計的迭代器。我們使用一個ArrayList作為底層的資料結構,設計一個內部類LinksIterator來實現MyIterator介面,這樣可以提供迭代器功能。通過public MyIterator<T> browser()方法返回該迭代器的例項。
Links.java
package com.zj.iterator;
import java.util.ArrayList;
import java.util.List;
public class Links<T> {
private List<T> items = new
ArrayList<T>();
public void add(T x) {
items.add(x);
}
private class LinksIterator implements
MyIterator<T> { private int i = 0;
public boolean end() {
return i == items.size();
}
public T current() {
return items.get(i);
}
public void next() {
if (i < items.size())
i++;
}
}
public MyIterator<T>
browser() { return new LinksIterator();
}
public static void main(String[] args) {
Links<Integer> links = new Links<Integer>();
for (int i = 1; i < 6; i++)
links.add(i);
// use MyIterator
MyIterator<Integer> myItr =
links.browser(); while (!myItr.end()) {
System.out.print(myItr.current() + ” “);
myItr.next();
}
}
}
|
在Link2.java中,我們使用一個匿名內部類替代Links.java中內部類的設計。
Links2.java
package com.zj.iterator;
import java.util.ArrayList;
import java.util.List;
public class Links2<T> {
private List<T> items = new
ArrayList<T>();
public void add(T x) {
items.add(x);
}
public MyIterator<T>
browser() { return new MyIterator<T>() {
private int i = 0;
public boolean end() {
return i == items.size();
}
public T current() {
return items.get(i);
}
public void next() {
if (i < items.size())
i++;
}
};
}
public static void main(String[] args) {
Links2<Integer> links = new
Links2<Integer>(); for (int i = 1; i < 6; i++)
links.add(i);
// use MyIterator
MyIterator<Integer> myItr =
links.browser(); while (!myItr.end()) {
System.out.print(myItr.current() + ” “);
myItr.next();
}
}
}
|
2.使用Java提供的迭代器
Java提供一個專門的迭代器<<interface>>Iterator,我們可以對某個序列實現該interface,來提供標準的Java迭代器。
<<interface>>Iterator.java
package java.util;
public interface Iterator<E> {
boolean hasNext();
E next();
void remove();
}
|
我們在Links2.java的基礎上,重新設計並使用實現標準的Iterator介面方法。
Links3.java
package com.zj.iterator.standard;
import java.util.ArrayList;
import java.util.Iterator;
import java.util.List;
public class Links3<T> {
private List<T> items = new
ArrayList<T>();
public void add(T x) {
items.add(x);
}
public Iterator<T> iterator()
{ return new Iterator<T>() {
private int index = 0;
public boolean hasNext() {
return index < items.size();
}
public T next() {
return items.get(index++);
}
public void remove() { // Not implemented
throw new UnsupportedOperationException();
}
};
}
public static void main(String[] args) {
Links3<Integer> links = new
Links3<Integer>(); for (int i = 1; i < 6; i++)
links.add(i);
// use Standard Iterator
Iterator<Integer> myItr =
links.iterator(); while (myItr.hasNext())
System.out.print(myItr.next() + ” “);
}
}
|
3.Java迭代器與Foreach語法
Java中還提供了一個Iterable介面,該介面要求提供一個標準的Iterator實現。
<<interface>>Iterable.java
package java.lang;
import java.util.Iterator;
public interface Iterable<T> {
Iterator<T> iterator();
}
|
只要實現了該介面,就可以通過Foreach語法遍歷你的底層序列。Links4.java實現了Iterable介面,則就可以使用Foreach語法遍歷它的底層序列。
Links4.java
package com.zj.iterator.standard;
import java.util.ArrayList;
import java.util.Iterator;
import java.util.List;
public class Links4<T> implements
Iterable<T> { private List<T> items = new
ArrayList<T>();
public void add(T x) {
items.add(x);
}
public Iterator<T> iterator()
{ return new Iterator<T>() {
private int index = 0;
public boolean hasNext() {
return index < items.size();
}
public T next() {
return items.get(index++);
}
public void remove() { // Not implemented
throw new UnsupportedOperationException();
}
};
}
public static void main(String[] args) {
Links4<Integer> links = new
Links4<Integer>(); for (int i = 1; i < 6; i++)
links.add(i);
// use Foreach
for (Integer integer : links)
System.out.print(integer + ” “);
}
}
|
你也可以提供該介面的多個不同的實現,基於此來提供多個不同功能的迭代器。Links5.java中提供了兩種不同功能的迭代器,除了常規的順序遍歷迭代器外,還提供一個遍歷偶序號元素的迭代器。
Links5.java
package com.zj.iterator.standard;
import java.util.ArrayList;
import java.util.Iterator;
import java.util.List;
public class Links5<T> implements
Iterable<T> { private List<T> items = new ArrayList<T>();
public void add(T x) {
items.add(x);
}
public Iterator<T> iterator()
{ return new Iterator<T>() {
private int index = 0;
public boolean hasNext() {
return index < items.size();
}
public T next() {
return items.get(index++);
}
public void remove() { // Not implemented
throw new UnsupportedOperationException();
}
};
}
public Iterable<T> even() {
return new Iterable<T>() {
public Iterator<T> iterator()
{ return new Iterator<T>() {
private int index = 0;
public boolean hasNext() {
return index < items.size();
}
public T next() {
index += 2;
return items.get(index – 2);
}
public void remove() { // Not implemented
throw new UnsupportedOperationException();
}
};
}
};
}
public static void main(String[] args) {
Links5<Integer> links = new Links5<Integer>();
for (int i = 1; i < 6; i++)
links.add(i);
// use Foreach default
for (Integer integer : links)
System.out.print(integer + ”
“); System.out.println();
// use Foreach even
for (Integer integer : links.even())
System.out.print(integer + ” “);
}
}
|