1. 程式人生 > 其它 >Java之集合的遍歷與迭代器

Java之集合的遍歷與迭代器

集合的遍歷

依次獲取集合中的每一個元素

將集合轉換成陣列,遍歷陣列

//取出所有的學號, 迭代之後顯示學號為1004-1009
        Object[]  c=map.keySet().toArray();//取出學號轉換為陣列
        System.out.println(c);
        for (int i = 0; i < c.length; i++) {

            int n=(int)c[i];//陣列向下轉型
            if(n>=1004&&n<=1009){
                System.out.println(n);
            }
        }

 for迴圈與迭代器

package collectionTest;

import java.util.ArrayList;
import java.util.Collection;
import java.util.HashMap;
import java.util.Iterator;
import java.util.List;
import java.util.Map;
import java.util.Set;

public class test {
    public static void main(String[] args) {
        List list=new ArrayList();
        list.add("aaa");
        list.add("ccc");
        list.add("vvv");
        list.add("bbb");
        list.add("nnn");
        for (int i = 0; i < list.size(); i++) {
            System.out.println(list.get(i));
        }
        //foreach迴圈遍歷,沒有下標,需要的話可以自己定義
        for(Object s:list){
            System.out.println(s);
        }
        Iterator iter=list.iterator();
        while(iter.hasNext()){//判斷有沒有下一個
            System.out.println(iter.next());
        }
        Map map=new HashMap();
        map.put("aa", 1);
        map.put("bb", 2);
        map.put("cc", 3);
        map.put("dd", 4);
        
        Set set=map.keySet();//返回Set集合,存放map的鍵的值
        for(Object o:set){
            System.out.println(o);//輸出物件的鍵
            System.out.println(map.get(o));//輸出物件的值,無序
        }
        Iterator iter2=set.iterator();
        while(iter2.hasNext()){//遍歷
            System.out.println(map.get(iter2.next()));
        }
        Collection c=map.values();//返回Collection
        Iterator iter3=c.iterator();
        while(iter3.hasNext()){
            System.out.println(iter3.next());
        }
    }
}

Iterator iterator():迭代器,集合的專用遍歷方式

import java.util.ArrayList;
import java.util.Collection;
import java.util.Iterator;

public class Test1 {
    public static void main(String[] args) {
        // 建立集合物件
        Collection c = new ArrayList();

        // 建立並新增元素
        // String s = "hello";
        // c.add(s);
        c.add("hello");
        c.add("world");
        c.add("java");

        // Iterator iterator():迭代器,集合的專用遍歷方式
        Iterator it = c.iterator(); // 實際返回的肯定是子類物件,這裡是多型

        // Object obj = it.next();返回下一個元素,然後跳到下一個,最開始因為本身沒有所以返回的是第一個
        // System.out.println(obj);
        // System.out.println(it.next());//返回下一個元素之後自身跳到下一個等待呼叫
        // System.out.println(it.next());
        // System.out.println(it.next());
        // System.out.println(it.next());
        // 最後一個不應該寫,所以,我們應該在每次獲取前,如果有一個判斷就好了
        // 判斷是否有下一個元素,有就獲取,沒有就不搭理它

        // if (it.hasNext()) {
        // System.out.println(it.next());
        // }
        // if (it.hasNext()) {
        // System.out.println(it.next());
        // }
        // if (it.hasNext()) {
        // System.out.println(it.next());
        // }
        // if (it.hasNext()) {
        // System.out.println(it.next());
        // }
        // if (it.hasNext()) {
        // System.out.println(it.next());
        // }

        // 最終版程式碼
        while (it.hasNext()) {
            // System.out.println(it.next());
            String s = (String) it.next();
            System.out.println(s);//如果這裡輸出的是it.next()  就會跳著輸出下一個
        }
    }
}

for 迭代

for(Iterator it = c.iterator();it.hasNext();){
            
            String s = (String) it.next();
            System.out.println(s);
        }

這種方法的優勢在於,迴圈結束後 Iterator it 就被銷燬了,所以比使用while更加節約資源。

迭代器使用問題的探討:

Iterator iter=list.iterator();//iterator返回的是子類物件,這裡是多型
        while(iter.hasNext()){
            System.out.println("學生姓名:"+((Student)iter.next()).getName());//通過轉型在呼叫getName方法
        }

以上這種方法可以通過轉型選擇性的輸出物件的資訊,但是需要特別注意的是,輸出只能呼叫一次 next 方法,如果多次呼叫 ,再次出現next就是下一個物件了。

迭代器的原理

迭代器為什麼是一個介面而不是一個類?

如果迭代器是一個類,這樣我們就可以建立迭代器的物件,使用該類的方法來事先集合的遍歷。但是Java中有不同的集合類,這些類的資料結構也是不同的,所以儲存方式和遍歷方式也應該是不同的,所以使用將迭代器定義為一個類是不適合的。

無論是哪種集合,都應該具備獲取元素的操作,並且最好在輔助與判斷功能,這樣在獲取前先判斷更不容易出錯,也就是說判斷功能和獲取功能應該是一個集合所具備的,而每種集合的方式也不太一樣,所以我們把這兩個功能提取出來並不具體實現,這就是介面。

真正的實現類,在真正具體的子類中,以內部類的方式體現的。

迭代器的原始碼

public interface Inteator {
    boolean hasNext();
    Object next(); 
}

public interface Iterable {
    Iterator iterator();
}

public interface Collection extends Iterable {
    Iterator iterator();
}

public interface List extends Collection {
    Iterator iterator();
}

public class ArrayList implements List {
    public Iterator iterator() {
        return new Itr();
    }
    
    private class Itr implements Iterator {
        public boolean hasNext() {}
        public Object next(){} 
    }
}


Collection c = new ArrayList();
c.add("hello");
c.add("world");
c.add("java");
Iterator it = c.iterator();     //new Itr();
while(it.hasNext()) {
    String s = (String)it.next();
    System.out.println(s);
}