6.3.迭代
\(6.3\)迭代
1.增强型\(for\)循环
我们知道,可以用以下\(for\)语句实现对数组元素的遍历:
1
2
3
4
5Set<String> s = new HashSet<>();
...
for (String city : s) {
...
}
这与下面的程序等价: 1
2
3
4
5
6
7Set<String> s = new HashSet<>();
...
Iterator<String> seer = s.iterator();
while (seer.hasNext()) {
String city = seer.next();
...
}
这个程序的关键在于被称作迭代器(\(iterator\))的对象。我们可以使用如下方法返回一个迭代器对象:
1
public Iterator<E> iterator();
例如,我们可以通过如下语句实现对\(List\)的迭代遍历: 1
2
3
4
5
6
7List<Integer> friends = new ArrayList<Integer>();
...
Iterator<Integer> seer = friends.iterator();
while (seer.hasNext()) {
System.out.println(seer.next());
}
这个迭代器有三个关键方法:
- 获得迭代器对象:
Iterator<Integer> seer = friends.iterator();
。 - 检测是否有对象剩余:
seer.hasNext()
。 - 返回当前对象、并使迭代器前进一个对象:
seer.next()
。
2.迭代器的实现
\(a.\)迭代器要素
首先,我们考虑编译器需要知道哪些可迭代对象的信息。首先,iterator()
被调用了,于是我们需要知道:
- 该接口具有
iterator()
方法。
其次,\(seer\)的.next()
与.hasNext()
方法被调用了,于是:
*
迭代器接口是否有.next()
与.hasNext()
方法。
\(b.\)迭代器的实现
我们的\(List\)接口需要扩展迭代器接口,继承迭代器的抽象方法:
1
2
3
4
5
6
7public interface Iterable<T> {
Iterator<T> iterator();
}
public interface List<T> extends Iterable<T> {
...
}编译器检查迭代器接口是否具有
.next()
与.hasNext()
方法:1
2
3
4public interface Iterator<T> {
boolean hasNext();
T next();
}
特定的类需要实现自己的迭代器方法与行为。例如,我们想给\(ArrarMap\)添加一个迭代器。可以先如下实现迭代器接口所需方法:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17private class ArraySetIterator implements Iterator<T> {
private int wizPos;
public ArraySetIterator() {
wizPos = 0;
}
public boolean hasNext() {
return wizPos < size;
}
public T next() {
T returnItem = items[wizPos];
wizPos += 1;
return returnItem;
}
}
这样,我们就可以利用\(ArraySetIterator\)来实现对\(ArrayMap\)的迭代: 1
2
3
4
5
6
7
8
9
10ArraySet<Integer> aset = new ArraySet<>();
aset.add(5);
aset.add(23);
aset.add(42);
Iterator<Integer> iter = aset.iterator();
while(iter.hasNext()) {
System.out.println(iter.next());
}
\(c.\)增强型\(for\)循环的实现
为了实现增强型\(for\)循环,我们需要让\(ArrayMap\)类实现可迭代接口。可迭代接口的关键方法是iterator
,我们只需要如下实现:
1
2
3public Iterator<T> iterator() {
return new ArraySetIterator();
}
这样以后,我们就可以使用增强型\(for\)循环了: 1
2
3
4
5ArraySet<Integer> aset = new ArraySet<>();
...
for (int i : aset) {
System.out.println(i);
}
\(d.\)关键概念辨析
可迭代对象(\(iterable\)):使得一个类可以被迭代的接口,需要方法
iterator()
。迭代器(\(iterator\)):定义某些方法的接口,这些方法用于实现真正的迭代。
You can think of an Iterator as a machine that you put onto an iterable that facilitates the iteration. Any iterable is the object on which the iterator is performing.
3.可迭代\(ArraySet\)的完整实现
1 | import java.util.Iterator; |