迭代器,泛型中的?,增強for循環


集合框架:

    集合本身是一個工具,在java.util的包裏面,所以每次在使用的時候都需要導包.

由於集合中每個容器的數據結構各不相同,不同的容器進行向上抽取,最終就形成了這個框架,也就是collection接口.在接口中有集合框架的很多共性內容,

   

在API中,有更多的Collection接口的用法.

    那麼在Collection中,學習他,學習任何容器都要記住3點就可以很好的掌握,

首先是結構,其次是添加元素,最後是獲取元素,前兩者的方法和之前學的集合,數組都很類似,就不過多介紹,唯獨獲取方式比較特殊,下面單獨介紹一下如何在Collection中獲取元素.

獲取集合中的元素通常就要用到迭代器,或者增強for循環來進行對其的遍歷,

集合中把獲取元素的方式儲存在Iterator接口中,稱之爲迭代器:

Iterator接口

Iterator接口中常用的兩種方法

hasNext()這個方法負責查找集合中是否存在元素,不管元素有多少,有幾個,是什麼元素,它只負責查找,如果有元素,他的返回值將會有一個boolean的變量進行判斷,如果爲true繼續查找,如果爲false,停止查找.(一般配合while循環進行使用).

 

nest()將查找的元素取出來,直到循環結束時候,它將停止運行,他的返回值類型與取出來的元素相匹配.

 

注意:

 在進行集合元素取出時,如果集合中已經沒有元素了,還繼續使用迭代器的next方法,將會發生java.util.NoSuchElementException沒有集合元素的錯誤.

迭代器的聲明方式:

Iterator<集合中數據類型>iterator()

增強for循環

    如果說在進行對集合遍歷的時候不需要考慮到使用索引,那麼可以用增強for循環來進行遍歷

格式:

for(元素的數據類型  變量 : Collection集合or數組){

}

泛型中的?

當使用泛型類或者接口時,傳遞的數據中,泛型類型不確定,可以通過通配符<?>表示。但是一旦使用泛型的通配符後,只能使用Object類中的共性方法,集合中元素自身方法無法使用。

定義:(查看ArrayList的構造方法)無法在類中使用

使用:調用方法時可以給予任意類型,參照API中rraylist的構造方法.

?extendsE代表只要是E類型的子類即可

 

?super E代表只要是E類型的父類即可

 

 

/*

*泛型的限定

 * 上限限定  ? extends Animal 只能傳 Animal及其子類

 * 下限限定   ? super Animal 只能傳Animal及其父類

利用增強for循環進行遍歷集合

*/

import java.util.ArrayList;

import java.util.Collection;

 

publicclass test {

   publicstaticvoidmain(String[] args) {

      ArrayList<Animal>list= newArrayList<Animal>();

      list.add(newAnimal());

      list.add(newAnimal());

      ArrayList<dog>list2= newArrayList<dog>();

      list2.add(newdog());

      list2.add(newdog());

     

      ArrayList<cat>list3= newArrayList<cat>();

      list3.add(newcat());

      list3.add(newcat());

      ArrayList<String>list4= newArrayList<String>();

      list4.add("abc");

      list4.add("d");

     

      //show(list3);

      //show(list2);

      show(list);

   }

//定義一個方法 可以遍歷這幾個結合,並且調用eat的方法

   publicstaticvoidshow(ArrayList<?extendsAnimal> list){

      for(Objectobj:list){

//強制轉換,將obj強制轉換成Animal類型.

        Animala= (Animal)obj;

        a.eat();

      }

 

   }

  

}

Animal類

publicclass Animal {

   publicvoideat(){

      System.out.println("動物會喫東西");

   }

}

定義dog類,繼承Animal,重寫Animal的eat方法

publicclass dog extendsAnimal{

   publicvoideat(){

      System.out.println("狗喫肉");

   }

 

}

 

定義cat類, 繼承Animal,重寫Animal的eat方法

publicclass cat extendsAnimal {

   publicvoideat(){

      System.out.println("貓喫魚");

   }

}

自定義學生類:包含姓名,年齡,成績屬性.私有成員變量,生成無參,有參構造方法,生成get/set方法.創建5個學生放到ArrayList中.使用迭代器獲取每個學生信息.統計總分,平均分,最高分,最低分並輸出

publicclass Student {

    private String name;

    privateintage;

    privatedoublescore;

   

    public Student() {}

    public Student(String name,intage, doublescore) {

       this.name = name;

       this.age = age;

       this.score = score;

    }

   

    // getxxx/setxxx

}

測試類:

publicclass Test01 {

    publicstaticvoid main(String[] args) {

       // 定義ArrayList

       ArrayList<Student> students = new ArrayList<>();

      

       // 添加5個學生

       students.add(new Student("張三", 20, 99));

       students.add(new Student("王昭君", 21, 88));

       students.add(new Student("西施", 20, 80));

       students.add(new Student("楊玉環", 20, 70));

       students.add(new Student("鳳姐", 22, 30));

      

       // 獲取迭代器

       Iterator<Student> itr = students.iterator();

      

       // 定義總分

       doubletotalScore = 0;

       // 定義最高分

       doublemaxScore = students.get(0).getScore();

       // 定義最低分

       doubleminScore = students.get(0).getScore();

      

       // 循環判斷是否有下一個學生

       while (itr.hasNext()) {

       // 使用next方法獲取學生對象

           Student student = itr.next();

          

       // 將這個學生對象的分數添加到總分

           totalScore += student.getScore();

          

       // 判斷這個學生的分數是否大於最大分數

           if (maxScore < student.getScore()) {

       // 這個學生的分數大於最大分數.最大分數等於這個學生的分數     

              maxScore = student.getScore();

           } elseif (minScore > student.getScore()) {

       // 判斷這個學生的分數是否大低最大分數

       // 這個學生的分數小於最小分數.最小分數等於這個學生的分數

              minScore = student.getScore();

           }

       }

      

       // 計算平均分(平均分 = 總分/人數)

       doubleavgScore = totalScore / students.size();

       // 打印總分,最高分,最低分

       System.out.println("總分 = " + totalScore + " ,平均分 = " + avgScore + " ,最高分 = " + maxScore + ",最低 = " + minScore);

    }

}

 

 

 

 

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章