Java 迭代器詳解:Iterator、ListIterator 與 foreach
foreach 語法
for (ElementType item : collectionOrArray) { ... }
- Java 5 引入,遍歷數組/集合極其便捷。
- 本質是
for 的語法糖,可改寫為普通 for,但不能完全替代(如需索引、逆序、修改集合)。
代碼綜合示例
package com.twzheng;
import java.util.*;
public class MainClass {
private static Scanner scanner = new Scanner(System.in);
public static void main(String[] args) {
LinkedList<String> list = new LinkedList<>();
printList(list); // Iterator 遍歷
initialLinkedList(list); // ListIterator 操作
System.out.print("查找值: ");
String val = scanner.next();
System.out.println(findMember(list, val) ? "存在" : "不存在"); // foreach
printList(list);
}
// Iterator 單向遍歷
private static void printList(LinkedList<String> list) {
System.out.println("======================================");
Iterator<String> it = list.iterator();
if (!it.hasNext()) { System.out.println("空列表"); return; }
int i = 0;
while (it.hasNext()) System.out.println(" <" + i++ + ">" + it.next());
System.out.println("^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^");
}
// foreach 查找
private static boolean findMember(LinkedList<String> list, String target) {
for (String s : list) {
if (s.equals(target)) {
System.out.println("發現於索引 " + list.indexOf(s));
return true;
}
}
return false;
}
// ListIterator 雙向、添加
private static boolean addMember(LinkedList<String> list, String val) {
ListIterator<String> lit = list.listIterator();
while (lit.hasNext()) {
int cmp = lit.next().compareTo(val);
if (cmp == 0) { System.out.println("已存在"); return false; }
if (cmp > 0) { lit.previous(); lit.add(val); System.out.println("已插入"); return true; }
}
lit.add(val); return true;
}
// 交互式初始化
private static void initialLinkedList(LinkedList<String> list) {
System.out.println("初始化列表:");
boolean stop = false;
try {
while (!stop) {
System.out.println(" 0-結束 1-添加");
switch (scanner.nextInt()) {
case 0: stop = true; break;
case 1: System.out.print("值: "); addMember(list, scanner.next()); break;
default: System.out.println("輸入錯誤");
}
}
} catch (Exception e) { System.out.println("輸入錯誤"); }
}
}