1. 程式人生 > >迭代器和foreach迴圈

迭代器和foreach迴圈

遍歷不同容器的元素,如果為每個容器都設計一套遍歷方法,會很麻煩。迭代器Iterator提供了這樣的便利,它可以遍歷並且得到容器中的物件,而不必關心容器的具體型別。

Java的Iterator只能單向移動。

Iterator由實現了Iterable介面的類的iterator()方法 返回,初始時指向第一個元素前的位置。next()向後移動時指向2個元素之間的位置。remove()方法刪除next()方法返回的元素。如果沒有更多元素,remove和next會丟擲異常,所以在進行遍歷前要用hasNext方法判斷是否包含下個元素。

任何實現Iterable介面的類,既可以使用迭代器,也可以使用foreach迴圈遍歷元素

	public static void main(String[] args) {
		Set<String> set = new HashSet<String>();
		set.add("abc");
		set.add("def");
		
		Iterator<String> iterator = set.iterator();
		while (iterator.hasNext()) {
			System.out.println(iterator.next());
		}
		
		for (String s : set) {
			System.out.println(s);
		}
	}

可以自己實現Iterator介面以使用foreach迴圈 
public class Test implements Iterable<String>{

    private ArrayList<String> words;
	
	public static void main(String[] args) {
		Test t = new Test();
		t.insert("abc");
		t.insert("def");
	    for (String s : t) {
	    	System.out.println(s);
	    }
	}
	
	public Test() {
		words = new ArrayList<String>();
	}
	
	public void insert(String word) {
		words.add(word);
	}
     
	@Override
	public Iterator<String> iterator() {
		
		return new Iterator<String>() {
			private int index = 0;

			@Override
			public boolean hasNext() {
				return index < words.size();
			}

			@Override
			public String next() {
				return words.get(index++);
			}

			@Override
			public void remove() {
				words.remove(index);
			}
		};
	}
}