1. 程式人生 > 其它 >leetcode 394 字串解碼.

leetcode 394 字串解碼.

集合元素的遍歷操作,使用迭代器Iterator介面

  1. 內部方法:hasNext() 和 next()
  2. 集合物件每次呼叫iterator()方法都得到一個全新的迭代器物件,預設遊標都在集合的第一個元素之前。
  3. 內部定義了remove(),可以在遍歷的時候,刪除集合中的元素。此方法不同於集合直接呼叫remove()

1. 集合元素的遍歷

    @Test
    public void test1(){
        Collection coll = new ArrayList();
        coll.add(123);
        coll.add(456);
        coll.add(new Person("Jerry",20));
        coll.add(new String("Tom"));
        coll.add(false);

        Iterator iterator = coll.iterator();
        //方式一:
//        System.out.println(iterator.next());
//        System.out.println(iterator.next());
//        System.out.println(iterator.next());
//        System.out.println(iterator.next());
//        System.out.println(iterator.next());
//        //報異常:NoSuchElementException
//        System.out.println(iterator.next());

        //方式二:不推薦
        for (int i = 0; i < coll.size(); i++) {
            System.out.println(iterator.next());
        }

        //方式三:推薦
        //hasNext():判斷是否還有下一個元素
        while(iterator.hasNext()){
            //next():1.指標下移 2.將下移以後集合位置上的元素返回
            System.out.println(iterator.next());
        }
    }

2. 錯誤的遍歷方式

//        錯誤方式一:
//        Iterator iterator = coll.iterator();
//        while ((iterator.next()) != null){
//            System.out.println(iterator.next());
//        }

//        錯誤方式二:
//        集合物件每次呼叫iterator()方法都得到一個全新的迭代器物件,預設遊標都在集合的第一個元素之前。
//        while (coll.iterator().hasNext()){
//            System.out.println(coll.iterator().next());
//        }

3. 測試Iterator中的remove()

結論:如果還未呼叫next()或在上一次呼叫next方法之後已經呼叫了remove方法,再呼叫remove都會報IllegalStateException。

        //刪除集合中"Tom"
        Iterator iterator = coll.iterator();
        while (iterator.hasNext()){
//            iterator.remove();//如果還未呼叫next()就呼叫remove(),就會報異常
            Object obj = iterator.next();
            if("Tom".equals(obj)){
                iterator.remove();
//                iterator.remove();如果在上一次呼叫next方法之後已經呼叫了remove方法,同理,也會報異常
            }
        }

4. 使用增強for迴圈遍歷集合

jdk5.0新增了foreach迴圈,用於遍歷集合、陣列。

    @Test
    public void test1(){
        Collection coll = new ArrayList();
        coll.add(123);
        coll.add(456);
        coll.add(new Person("Jerry",20));
        coll.add(new String("Tom"));
        coll.add(false);

        //for(集合元素的型別 區域性變數 : 集合物件)
        //內部仍然呼叫了迭代器。
        for(Object obj : coll) {
            System.out.println(obj);
        }
    }

    @Test
    public void test2(){
        int[] arr = new int[]{1,2,3,4,5,6};
        //for(陣列元素的型別 區域性變數 : 陣列物件)
        for (int i : arr) {
            System.out.println(i);
        }
    }