建立自己的 Iterable 結構,以便與 Iterator 或 for-each 迴圈一起使用
為了確保我們的集合可以使用迭代器或 for-each 迴圈進行迭代,我們必須遵循以下步驟:
- 我們想要迭代的東西必須是
Iterable
並暴露iterator()
。 - 通過覆蓋
hasNext()
,next()
和remove()
設計一個java.util.Iterator
。
我在下面新增了一個簡單的通用連結串列實現,它使用上面的實體來使連結串列可迭代。
package org.algorithms.linkedlist;
import java.util.Iterator;
import java.util.NoSuchElementException;
public class LinkedList<T> implements Iterable<T> {
Node<T> head, current;
private static class Node<T> {
T data;
Node<T> next;
Node(T data) {
this.data = data;
}
}
public LinkedList(T data) {
head = new Node<>(data);
}
public Iterator<T> iterator() {
return new LinkedListIterator();
}
private class LinkedListIterator implements Iterator<T> {
Node<T> node = head;
@Override
public boolean hasNext() {
return node != null;
}
@Override
public T next() {
if (!hasNext())
throw new NoSuchElementException();
Node<T> prevNode = node;
node = node.next;
return prevNode.data;
}
@Override
public void remove() {
throw new UnsupportedOperationException("Removal logic not implemented.");
}
}
public void add(T data) {
Node current = head;
while (current.next != null)
current = current.next;
current.next = new Node<>(data);
}
}
class App {
public static void main(String[] args) {
LinkedList<Integer> list = new LinkedList<>(1);
list.add(2);
list.add(4);
list.add(3);
//Test #1
System.out.println("using Iterator:");
Iterator<Integer> itr = list.iterator();
while (itr.hasNext()) {
Integer i = itr.next();
System.out.print(i + " ");
}
//Test #2
System.out.println("\n\nusing for-each:");
for (Integer data : list) {
System.out.print(data + " ");
}
}
}
輸出
using Iterator:
1 2 4 3
using for-each:
1 2 4 3
這將在 Java 7+中執行。你可以通過替換來使其在 Java 5 和 Java 6 上執行:
LinkedList<Integer> list = new LinkedList<>(1);
同
LinkedList<Integer> list = new LinkedList<Integer>(1);
或者通過合併相容的更改,只是任何其他版本。