1. 程式人生 > >20_集合_第20天(Map、可變參數、Collections)_講義

20_集合_第20天(Map、可變參數、Collections)_講義

system 情況 鍵盤錄入 arc 模擬 增強for entry face equals

今日內容介紹
1、Map接口
2、模擬鬥地主洗牌發牌

01Map集合概述

A:Map集合概述:

我們通過查看Map接口描述,發現Map接口下的集合與Collection接口下的集合,它們存儲數據的形式不同
?   a:Collection中的集合,元素是孤立存在的(理解為單身),向集合中存儲元素采用一個個元素的方式存儲。
?   
    b:Map中的集合,元素是成對存在的(理解為夫妻)。每個元素由鍵與值兩部分組成,通過鍵可以找對所對應的值。
? 
    Collection中的集合稱為單列集合,Map中的集合稱為雙列集合。
?   需要註意的是,Map中的集合不能包含重復的鍵,值可以重復;每個鍵只能對應一個值。
Map
 |--HashMap
 |--LinkedHashMap

02Map接口中的常用方法

A:Map接口中的常用方法

   /*
    *  Map接口中的常用方法
    *    使用Map接口的實現類 HashMap
    */
   public class MapDemo {
    public static void main(String[] args) {
        function_2();
    }
    /*
     *  移除集合中的鍵值對,返回被移除之前的值
     *  V remove(K)
     */
    public static void function_2(){
        Map<Integer,String> map = new HashMap<Integer, String>();
        map.put(1, "a");
        map.put(2, "b");
        map.put(3, "c");
        System.out.println(map);
        
        String value = map.remove(33);
        System.out.println(value);
        System.out.println(map);
    }
    
    /*
     * 通過鍵對象,獲取值對象
     * V get(K)
     * 如果集合中沒有這個鍵,返回null
     */
    public static void function_1(){
        //創建集合對象,作為鍵的對象整數,值的對象存儲字符串
        Map<Integer,String> map = new HashMap<Integer, String>();
        map.put(1, "a");
        map.put(2, "b");
        map.put(3, "c");
        System.out.println(map);
        
        String value = map.get(4);
        System.out.println(value);
    }
    
    /*
     *  將鍵值對存儲到集合中
     *  V put(K,V) K 作為鍵的對象, V作為值的對象
     *  存儲的是重復的鍵,將原有的值,覆蓋
     *  返回值一般情況下返回null,
     *  存儲重復鍵的時候,返回被覆蓋之前的值
     */
    public static void function(){
        //創建集合對象,HashMap,存儲對象,鍵是字符串,值是整數
        Map<String, Integer> map = new HashMap<String, Integer>();
        map.put("a", 1);
        
        map.put("b", 2);
        
        map.put("c", 3);
        
        System.out.println(map);
    }
   }

03Map集合遍歷方式keySet方法

A:Map集合遍歷方式keySet方法

 1.獲取Map集合中所有的鍵,由於鍵是唯一的,所以返回一個Set集合存儲所有的鍵
 2.遍歷鍵的Set集合,得到每一個鍵
 3.根據鍵利用get(key)去Map找所對應的值
 /*
  *  Map集合的遍歷
  *    利用鍵獲取值
  *    Map接口中定義方法keySet
  *    所有的鍵,存儲到Set集合
  */
 public class MapDemo1 {
    public static void main(String[] args) {
        /*
         *  1. 調用map集合的方法keySet,所有的鍵存儲到Set集合中
         *  2. 遍歷Set集合,獲取出Set集合中的所有元素 (Map中的鍵)
         *  3. 調用map集合方法get,通過鍵獲取到值
         */
        Map<String,Integer> map = new HashMap<String,Integer>();
        map.put("a", 11);
        map.put("b", 12);
        map.put("c", 13);
        map.put("d", 14);
        
        //1. 調用map集合的方法keySet,所有的鍵存儲到Set集合中
        Set<String> set = map.keySet();
        //2. 遍歷Set集合,獲取出Set集合中的所有元素 (Map中的鍵)
        Iterator<String> it = set.iterator();
        while(it.hasNext()){
            //it.next返回是Set集合元素,也就是Map中的鍵
            //3. 調用map集合方法get,通過鍵獲取到值
            String key = it.next();
            Integer value = map.get(key);
            System.out.println(key+"...."+value);
        }
        
        System.out.println("=======================");
        

        for(String key : map.keySet()){
            Integer value = map.get(key);
            System.out.println(key+"...."+value);
        }
    }
 }

04Map集合Entry對象

A:Map集合Entry對象

 interface Map{
    interface Entry{//Entry是Map的一個內部接口
                   //由Map的子類的內部類實現

    }
 }
 class HashMap{
    static class Entry<K,V> implements Map.Entry<K,V> {//Entry對象指的就是該類的對象
        final K key;
              V value;
    }
 }
 在Map類設計時,提供了一個嵌套接口:Entry。
 Entry將鍵值對的對應關系封裝成了對象。
 即鍵值對對象,這樣我們在遍歷Map集合時,就可以從每一個鍵值對(Entry)對象中獲取對應的鍵與對應的值。
   a:Entry是Map接口中提供的一個靜態內部嵌套接口。
   b:相關方法
 ?   getKey()方法:獲取Entry對象中的鍵
 ?  getValue()方法:獲取Entry對象中的值
 ?  entrySet()方法:用於返回Map集合中所有的鍵值對(Entry)對象,以Set集合形式返回。

05Map集合遍歷方式entrySet方法

A:Map集合遍歷方式entrySet方法

*
 *  Map集合獲取方式
 *  entrySet方法,鍵值對映射關系(結婚證)獲取
 *  實現步驟:
 *    1. 調用map集合方法entrySet()將集合中的映射關系對象,存儲到Set集合
 *        Set<Entry <K,V> >
 *    2. 叠代Set集合
 *    3. 獲取出的Set集合的元素,是映射關系對象
 *    4. 通過映射關系對象方法 getKet, getValue獲取鍵值對
 *    
 *    創建內部類對象 外部類.內部類 = new 
 */
public class MapDemo2 {
    public static void main(String[] args) {
        Map<Integer,String> map = new HashMap<Integer, String>();
        map.put(1, "abc");
        map.put(2, "bcd");
        map.put(3, "cde");
        //1. 調用map集合方法entrySet()將集合中的映射關系對象,存儲到Set集合
        Set<Map.Entry <Integer,String> >  set = map.entrySet();
        //2. 叠代Set集合
        Iterator<Map.Entry <Integer,String> > it = set.iterator();
        while(it.hasNext()){
            //  3. 獲取出的Set集合的元素,是映射關系對象
            // it.next 獲取的是什麽對象,也是Map.Entry對象
            Map.Entry<Integer, String> entry = it.next();
            //4. 通過映射關系對象方法 getKet, getValue獲取鍵值對
            Integer key = entry.getKey();
            String value = entry.getValue();
            System.out.println(key+"...."+value);
        }
        
         
    }
}

06Map集合遍歷方式增強for循環

A:Map集合遍歷方式增強for循環

 A:Map集合遍歷方式entrySet方法
  *
   *  Map集合獲取方式
   *  entrySet方法,鍵值對映射關系(結婚證)獲取
   *  實現步驟:
   *    1. 調用map集合方法entrySet()將集合中的映射關系對象,存儲到Set集合
   *        Set<Entry <K,V> >
   *    2. 叠代Set集合
   *    3. 獲取出的Set集合的元素,是映射關系對象
   *    4. 通過映射關系對象方法 getKet, getValue獲取鍵值對
   *    
   *    創建內部類對象 外部類.內部類 = new 
   */
  public class MapDemo2 {
    public static void main(String[] args) {
        Map<Integer,String> map = new HashMap<Integer, String>();
        map.put(1, "abc");
        map.put(2, "bcd");
        map.put(3, "cde");
        //1. 調用map集合方法entrySet()將集合中的映射關系對象,存儲到Set集合
        Set<Map.Entry <Integer,String> >  set = map.entrySet();
        //2. 叠代Set集合
        Iterator<Map.Entry <Integer,String> > it = set.iterator();
        while(it.hasNext()){
            //  3. 獲取出的Set集合的元素,是映射關系對象
            // it.next 獲取的是什麽對象,也是Map.Entry對象
            Map.Entry<Integer, String> entry = it.next();
            //4. 通過映射關系對象方法 getKet, getValue獲取鍵值對
            Integer key = entry.getKey();
            String value = entry.getValue();
            System.out.println(key+"...."+value);
        }
        
        System.out.println("=========================");
        for(Map.Entry<Integer, String> entry : map.entrySet()){
            System.out.println(entry.getKey()+"..."+entry.getValue());
        }
    }
  }
  
  註意:Map集合不能直接使用叠代器或者foreach進行遍歷。但是轉成Set之後就可以使用了。

07HashMap集合存儲和遍歷

A:HashMap集合存儲和遍歷

 /*
  *  使用HashMap集合,存儲自定義的對象
  *  自定義對象,作為鍵,出現,作為值出現
  */
 public class HashMapDemo {
    public static void main(String[] args) {
        function_1();
    }
    /*
     * HashMap 存儲自定義對象Person,作為鍵出現
     * 鍵的對象,是Person類型,值是字符串
     * 保證鍵的唯一性,存儲到鍵的對象,重寫hashCode equals
     */
    public static void function_1(){
        HashMap<Person, String> map = new HashMap<Person, String>();
        map.put(new Person("a",20), "裏約熱內盧");
        map.put(new Person("b",18), "索馬裏");
        map.put(new Person("b",18), "索馬裏");
        map.put(new Person("c",19), "百慕大");
        for(Person key : map.keySet()){
            String value = map.get(key);
            System.out.println(key+"..."+value);
        }
        System.out.println("===================");
        for(Map.Entry<Person, String> entry : map.entrySet()){
            System.out.println(entry.getKey()+"..."+entry.getValue());
        }
    }
    
    /*
     * HashMap 存儲自定義的對象Person,作為值出現
     * 鍵的對象,是字符串,可以保證唯一性
     */
    public static void function(){
        HashMap<String, Person> map = new HashMap<String, Person>();
        map.put("beijing", new Person("a",20));
        map.put("tianjin", new Person("b",18));
        map.put("shanghai", new Person("c",19));
        for(String key : map.keySet()){
            Person value = map.get(key);
            System.out.println(key+"..."+value);
        }
        System.out.println("=================");
        for(Map.Entry<String, Person> entry : map.entrySet()){
            String key = entry.getKey();
            Person value = entry.getValue();
            System.out.println(key+"..."+value);
        }
    }
 }

08LinkedHashMap的特點

*A:LinkedHashMap的特點

  /*
   *  LinkedHashMap繼承HashMap
   *  保證叠代的順序
   */
  public class LinkedHashMapDemo {
    public static void main(String[] args) {
        LinkedHashMap<String, String> link = new LinkedHashMap<String, String>();
        link.put("1", "a");
        link.put("13", "a");
        link.put("15", "a");
        link.put("17", "a");
        System.out.println(link);
    }
  }

09Hashtable的特點

*A:Hashtable的特點

   /*
    *  Map接口實現類 Hashtable
    *  底層數據結果哈希表,特點和HashMap是一樣的
    *  Hashtable 線程安全集合,運行速度慢
    *  HashMap 線程不安全的集合,運行速度快
    *  
    *  Hashtable命運和Vector是一樣的,從JDK1.2開始,被更先進的HashMap取代
    *  
    *  HashMap 允許存儲null值,null鍵
    *  Hashtable 不允許存儲null值,null鍵
    *  
    *  Hashtable他的孩子,子類 Properties 依然活躍在開發舞臺
    */
   public class HashtableDemo {
    public static void main(String[] args) {    
        Map<String,String> map = new Hashtable<String,String>();
        map.put(null, null);
        System.out.println(map);
    }
   }

10靜態導入

*A:靜態導入:如果本類中有和靜態導入的同名方法會優先使用本類的

           如果還想使用靜態導入的,依然需要類名來調用
   /*
    * JDK1.5新特性,靜態導入
    * 減少開發的代碼量
    * 標準的寫法,導入包的時候才能使用
    * 
    * import static java.lang.System.out;最末尾,必須是一個靜態成員
    */
   import static java.lang.System.out;
   import static java.util.Arrays.sort;


   public class StaticImportDemo {
    public static void main(String[] args) {
        out.println("hello");
        
        int[] arr = {1,4,2};
        sort(arr);
    }
   }

11方法的可變參數

*A:方法的可變參數

 /*
  *  JDK1.5新的特性,方法的可變參數
  *  前提: 方法參數數據類型確定,參數的個數任意
  *  可變參數語法: 數據類型...變量名
  *  可變參數,本質就是一個數組
  */
 public class VarArgumentsDemo {
    public static void main(String[] args) {
        //調用一個帶有可變參數的方法,傳遞參數,可以任意
    //  getSum();
        int sum = getSum(5,34,3,56,7,8,0);
        System.out.println(sum);

    }
 
    /*
     * 定義方法,計算10個整數和
     * 方法的可變參數實現
     */
    public static int getSum(int...a){
        int sum = 0 ;
        for(int i : a){
            sum = sum + i;
        }
        return sum;
    }
    
    /*
     * 定義方法,計算3個整數和
     */
    /*public static int getSum(int a,int b ,int c){
        return a+b+c;
    }*/
    
    /*
     * 定義方法,計算2個整數和
     */
    /*public static int getSum(int a,int b){
        return a+b;
    }*/
 }

12可變參數的註意事項

*A:可變參數的註意事項

   /*
    * 可變參數的註意事項
    * 1. 一個方法中,可變參數只能有一個
    * 2. 可變參數,必須寫在參數列表的最後一位
    */
    public static void function(Object...o){
     
    }

13Collections工具類

A:Collections工具類

  /*
   *  集合操作的工具類
   *    Collections
   */
  public class CollectionsDemo {
    public static void main(String[] args) {
        function_2();
    }
    /*
     * Collections.shuffle方法
     * 對List集合中的元素,進行隨機排列
     */
    public static void function_2(){
        List<Integer> list = new ArrayList<Integer>();
        list.add(1);
        list.add(5);
        list.add(9);
        list.add(11);
        list.add(8);
        list.add(10);
        list.add(15);
        list.add(20);   
        System.out.println(list);
        
        //調用工具類方法shuffle對集合隨機排列
        Collections.shuffle(list);
        System.out.println(list);
    }
    
    /*
     * Collections.binarySearch靜態方法
     * 對List集合進行二分搜索,方法參數,傳遞List集合,傳遞被查找的元素
     */
    public static void function_1(){
        List<Integer> list = new ArrayList<Integer>();
        list.add(1);
        list.add(5);
        list.add(8);
        list.add(10);
        list.add(15);
        list.add(20);
        //調用工具類靜態方法binarySearch
        int index = Collections.binarySearch(list, 16);
        System.out.println(index);
    }
    
    /*
     *  Collections.sort靜態方法
     *  對於List集合,進行升序排列
     */
    public static void function(){
        //創建List集合
        List<String> list = new ArrayList<String>();
        list.add("ewrew");
        list.add("qwesd");
        list.add("Qwesd");
        list.add("bv");
        list.add("wer");
        System.out.println(list);
        //調用集合工具類的方法sort
        Collections.sort(list);
        System.out.println(list);
    }
  }

14集合的嵌套

A:集合的嵌套

/*
 *  Map集合的嵌套,Map中存儲的還是Map集合
 *  要求:
 *    傳智播客  
 *      Java基礎班
 *        001  張三
 *        002  李四
 *      
 *      Java就業班
 *        001  王五
 *        002  趙六
 *  對以上數據進行對象的存儲
 *   001 張三  鍵值對
 *   Java基礎班: 存儲學號和姓名的鍵值對
 *   Java就業班:
 *   傳智播客: 存儲的是班級
 *   
 *   基礎班Map   <學號,姓名>
 *   傳智播客Map  <班級名字, 基礎班Map>
 */
public class MapMapDemo {
    public static void main(String[] args) {
        //定義基礎班集合
        HashMap<String, String> javase = new HashMap<String, String>();
        //定義就業班集合
        HashMap<String, String> javaee = new HashMap<String, String>();
        //向班級集合中,存儲學生信息
        javase.put("001", "張三");
        javase.put("002", "李四");
        
        javaee.put("001", "王五");
        javaee.put("002", "趙六");
        //定義傳智播客集合容器,鍵是班級名字,值是兩個班級容器
        HashMap<String, HashMap<String,String>> czbk =
                new HashMap<String, HashMap<String,String>>();
        czbk.put("基礎班", javase);
        czbk.put("就業班", javaee);
        
         keySet(czbk);
         
    }

15集合的嵌套keySet遍歷

A:集合的嵌套keySet遍歷

   /*
    *  Map集合的嵌套,Map中存儲的還是Map集合
    *  要求:
    *    傳智播客  
    *      Java基礎班
    *        001  張三
    *        002  李四
    *      
    *      Java就業班
    *        001  王五
    *        002  趙六
    *  對以上數據進行對象的存儲
    *   001 張三  鍵值對
    *   Java基礎班: 存儲學號和姓名的鍵值對
    *   Java就業班:
    *   傳智播客: 存儲的是班級
    *   
    *   基礎班Map   <學號,姓名>
    *   傳智播客Map  <班級名字, 基礎班Map>
    */
   public class MapMapDemo {
    public static void main(String[] args) {
        //定義基礎班集合
        HashMap<String, String> javase = new HashMap<String, String>();
        //定義就業班集合
        HashMap<String, String> javaee = new HashMap<String, String>();
        //向班級集合中,存儲學生信息
        javase.put("001", "張三");
        javase.put("002", "李四");
        
        javaee.put("001", "王五");
        javaee.put("002", "趙六");
        //定義傳智播客集合容器,鍵是班級名字,值是兩個班級容器
        HashMap<String, HashMap<String,String>> czbk =
                new HashMap<String, HashMap<String,String>>();
        czbk.put("基礎班", javase);
        czbk.put("就業班", javaee);
        
         keySet(czbk);
         
    }
    
     
    
    public static void keySet(HashMap<String,HashMap<String,String>> czbk){
        //調用czbk集合方法keySet將鍵存儲到Set集合
        Set<String> classNameSet = czbk.keySet();
        //叠代Set集合
        Iterator<String> classNameIt = classNameSet.iterator();
        while(classNameIt.hasNext()){
            //classNameIt.next獲取出來的是Set集合元素,czbk集合的鍵
            String classNameKey = classNameIt.next();
            //czbk集合的方法get獲取值,值是一個HashMap集合
            HashMap<String,String> classMap = czbk.get(classNameKey);
            //調用classMap集合方法keySet,鍵存儲到Set集合
            Set<String> studentNum = classMap.keySet();
            Iterator<String> studentIt = studentNum.iterator();
       
               while(studentIt.hasNext()){
                //studentIt.next獲取出來的是classMap的鍵,學號
                String numKey = studentIt.next();
                //調用classMap集合中的get方法獲取值
                String nameValue = classMap.get(numKey);
                System.out.println(classNameKey+".."+numKey+".."+nameValue);
            }
        }
        
        System.out.println("==================================");
        for(String className: czbk.keySet()){
           HashMap<String, String> hashMap = czbk.get(className);   
           for(String numKey : hashMap.keySet()){
               String nameValue = hashMap.get(numKey);
               System.out.println(className+".."+numKey+".."+nameValue);
           }
        }
    }

   } 
  

16集合的嵌套entrySet遍歷

A:集合的嵌套entrySet遍歷

/*
 *  Map集合的嵌套,Map中存儲的還是Map集合
 *  要求:
 *    傳智播客  
 *      Java基礎班
 *        001  張三
 *        002  李四
 *      
 *      Java就業班
 *        001  王五
 *        002  趙六
 *  對以上數據進行對象的存儲
 *   001 張三  鍵值對
 *   Java基礎班: 存儲學號和姓名的鍵值對
 *   Java就業班:
 *   傳智播客: 存儲的是班級
 *   
 *   基礎班Map   <學號,姓名>
 *   傳智播客Map  <班級名字, 基礎班Map>
 */
public class MapMapDemo {
    public static void main(String[] args) {
        //定義基礎班集合
        HashMap<String, String> javase = new HashMap<String, String>();
        //定義就業班集合
        HashMap<String, String> javaee = new HashMap<String, String>();
        //向班級集合中,存儲學生信息
        javase.put("001", "張三");
        javase.put("002", "李四");
        
        javaee.put("001", "王五");
        javaee.put("002", "趙六");
        //定義傳智播客集合容器,鍵是班級名字,值是兩個班級容器
        HashMap<String, HashMap<String,String>> czbk =
                new HashMap<String, HashMap<String,String>>();
        czbk.put("基礎班", javase);
        czbk.put("就業班", javaee);
        
        entrySet(czbk);
    }
    
    public static void entrySet(HashMap<String,HashMap<String,String>> czbk){
        //調用czbk集合方法entrySet方法,將czbk集合的鍵值對關系對象,存儲到Set集合
        Set<Map.Entry<String, HashMap<String,String>>> 
                                 classNameSet = czbk.entrySet();
        //叠代器叠代Set集合
        Iterator<Map.Entry<String, HashMap<String,String>>> classNameIt = classNameSet.iterator();
        while(classNameIt.hasNext()){
            //classNameIt.next方法,取出的是czbk集合的鍵值對關系對象
            Map.Entry<String, HashMap<String,String>> classNameEntry =  classNameIt.next();
            //classNameEntry方法 getKey,getValue
            String classNameKey = classNameEntry.getKey();
            //獲取值,值是一個Map集合
            HashMap<String,String> classMap = classNameEntry.getValue();
            //調用班級集合classMap方法entrySet,鍵值對關系對象存儲Set集合
            Set<Map.Entry<String, String>> studentSet = classMap.entrySet();
            //叠代Set集合
            Iterator<Map.Entry<String, String>> studentIt = studentSet.iterator();
            while(studentIt.hasNext()){
                //studentIt方法next獲取出的是班級集合的鍵值對關系對象
                Map.Entry<String, String> studentEntry = studentIt.next();
                //studentEntry方法 getKey getValue
                String numKey = studentEntry.getKey();
                String nameValue = studentEntry.getValue();
                System.out.println(classNameKey+".."+numKey+".."+nameValue);
            }
        }
         System.out.println("==================================");
        
        for (Map.Entry<String, HashMap<String, String>> me : czbk.entrySet()) {
            String classNameKey = me.getKey();
            HashMap<String, String> numNameMapValue = me.getValue();
            for (Map.Entry<String, String> nameMapEntry : numNameMapValue.entrySet()) {
                String numKey = nameMapEntry.getKey();
                String nameValue = nameMapEntry.getValue();
                System.out.println(classNameKey + ".." + numKey + ".." + nameValue);
            }
        }
    }
    

}

17鬥地主的功能分析

A:鬥地主的功能分析

   a:具體規則:
        1. 組裝54張撲克牌
        2. 將54張牌順序打亂
        3. 三個玩家參與遊戲,三人交替摸牌,每人17張牌,最後三張留作底牌。
        4. 查看三人各自手中的牌(按照牌的大小排序)、底牌
   b:分析:
      1.準備牌:
       完成數字與紙牌的映射關系:
       使用雙列Map(HashMap)集合,完成一個數字與字符串紙牌的對應關系(相當於一個字典)。
      2.洗牌:
       通過數字完成洗牌發牌
      3.發牌:
       將每個人以及底牌設計為ArrayList<String>,將最後3張牌直接存放於底牌,剩余牌通過對3取模依次發牌。
       存放的過程中要求數字大小與鬥地主規則的大小對應。
       將代表不同紙牌的數字分配給不同的玩家與底牌。
      4.看牌:
       通過Map集合找到對應字符展示。
       通過查詢紙牌與數字的對應關系,由數字轉成紙牌字符串再進行展示。

18鬥地主的準備牌

A:鬥地主的準備牌

 /*
  *  實現模擬鬥地主的功能
  *   1. 組合牌
  *   2. 洗牌
  *   3. 發牌
  *   4. 看牌
  */
 public class DouDiZhu {
    public static void main(String[] args) {
        //1. 組合牌
        //創建Map集合,鍵是編號,值是牌
        HashMap<Integer,String> pooker = new HashMap<Integer, String>();
        //創建List集合,存儲編號
        ArrayList<Integer> pookerNumber = new ArrayList<Integer>();
        //定義出13個點數的數組
        String[] numbers = {"2","A","K","Q","J","10","9","8","7","6","5","4","3"};
        //定義4個花色數組
        String[] colors = {"?","?","?","?"};
        //定義整數變量,作為鍵出現
        int index = 2;
        //遍歷數組,花色+點數的組合,存儲到Map集合
        for(String number : numbers){
            for(String color : colors){
                pooker.put(index, color+number);
                pookerNumber.add(index);
                index++;
            }
        }
        //存儲大王,和小王,索引是從0~54,對應大王,小王,...3(牌的順序從大到小)
        pooker.put(0, "大王");
        pookerNumber.add(0);
        pooker.put(1, "小王");
        pookerNumber.add(1);
     
 }

19鬥地主的洗牌

A:鬥地主的洗牌

  /*
   *  實現模擬鬥地主的功能
   *   1. 組合牌
   *   2. 洗牌
   *   3. 發牌
   *   4. 看牌
   */
  public class DouDiZhu {
    public static void main(String[] args) {
        //1. 組合牌
        //創建Map集合,鍵是編號,值是牌
        HashMap<Integer,String> pooker = new HashMap<Integer, String>();
        //創建List集合,存儲編號
        ArrayList<Integer> pookerNumber = new ArrayList<Integer>();
        //定義出13個點數的數組
        String[] numbers = {"2","A","K","Q","J","10","9","8","7","6","5","4","3"};
        //定義4個花色數組
        String[] colors = {"?","?","?","?"};
        //定義整數變量,作為鍵出現
        int index = 2;
        //遍歷數組,花色+點數的組合,存儲到Map集合
        for(String number : numbers){
            for(String color : colors){
                pooker.put(index, color+number);
                pookerNumber.add(index);
                index++;
            }
        }
        //存儲大王,和小王
        pooker.put(0, "大王");
        pookerNumber.add(0);
        pooker.put(1, "小王");
        pookerNumber.add(1);
        
        //洗牌,將牌的編號打亂
        Collections.shuffle(pookerNumber);
        
     
    }
     
  }

20鬥地主的發牌

A:鬥地主的發牌

/*
 *  實現模擬鬥地主的功能
 *   1. 組合牌
 *   2. 洗牌
 *   3. 發牌
 *   4. 看牌
 */
public class DouDiZhu {
    public static void main(String[] args) {
        //1. 組合牌
        //創建Map集合,鍵是編號,值是牌
        HashMap<Integer,String> pooker = new HashMap<Integer, String>();
        //創建List集合,存儲編號
        ArrayList<Integer> pookerNumber = new ArrayList<Integer>();
        //定義出13個點數的數組
        String[] numbers = {"2","A","K","Q","J","10","9","8","7","6","5","4","3"};
        //定義4個花色數組
        String[] colors = {"?","?","?","?"};
        //定義整數變量,作為鍵出現
        int index = 2;
        //遍歷數組,花色+點數的組合,存儲到Map集合
        for(String number : numbers){
            for(String color : colors){
                pooker.put(index, color+number);
                pookerNumber.add(index);
                index++;
            }
        }
        //存儲大王,和小王
        pooker.put(0, "大王");
        pookerNumber.add(0);
        pooker.put(1, "小王");
        pookerNumber.add(1);
        
        //洗牌,將牌的編號打亂
        Collections.shuffle(pookerNumber);
        
        //發牌功能,將牌編號,發給玩家集合,底牌集合
        ArrayList<Integer> player1 = new ArrayList<Integer>();
        ArrayList<Integer> player2 = new ArrayList<Integer>();
        ArrayList<Integer> player3 = new ArrayList<Integer>();
        ArrayList<Integer> bottom = new ArrayList<Integer>();
        
        //發牌采用的是集合索引%3
        for(int i = 0 ; i < pookerNumber.size() ; i++){
            //先將底牌做好
            if(i < 3){
                //存到底牌去
                bottom.add( pookerNumber.get(i));
               //對索引%3判斷
            }else if(i % 3 == 0){
                //索引上的編號,發給玩家1
                player1.add( pookerNumber.get(i) );
            }else if( i % 3 == 1){
                //索引上的編號,發給玩家2
                player2.add( pookerNumber.get(i) );
            }else if( i % 3 == 2){
                //索引上的編號,發給玩家3
                player3.add( pookerNumber.get(i) );
            }
        }
         
    }
     
}

21鬥地主的看牌

A:鬥地主的看牌

 /*
  *  實現模擬鬥地主的功能
  *   1. 組合牌
  *   2. 洗牌
  *   3. 發牌
  *   4. 看牌
  */
 public class DouDiZhu {
    public static void main(String[] args) {
        //1. 組合牌
        //創建Map集合,鍵是編號,值是牌
        HashMap<Integer,String> pooker = new HashMap<Integer, String>();
        //創建List集合,存儲編號
        ArrayList<Integer> pookerNumber = new ArrayList<Integer>();
        //定義出13個點數的數組
        String[] numbers = {"2","A","K","Q","J","10","9","8","7","6","5","4","3"};
        //定義4個花色數組
        String[] colors = {"?","?","?","?"};
        //定義整數變量,作為鍵出現
        int index = 2;
        //遍歷數組,花色+點數的組合,存儲到Map集合
        for(String number : numbers){
            for(String color : colors){
                pooker.put(index, color+number);
                pookerNumber.add(index);
                index++;
            }
        }
        //存儲大王,和小王
        pooker.put(0, "大王");
        pookerNumber.add(0);
        pooker.put(1, "小王");
        pookerNumber.add(1);
        
        //洗牌,將牌的編號打亂
        Collections.shuffle(pookerNumber);
        
        //發牌功能,將牌編號,發給玩家集合,底牌集合
        ArrayList<Integer> player1 = new ArrayList<Integer>();
        ArrayList<Integer> player2 = new ArrayList<Integer>();
        ArrayList<Integer> player3 = new ArrayList<Integer>();
        ArrayList<Integer> bottom = new ArrayList<Integer>();
        
        //發牌采用的是集合索引%3
        for(int i = 0 ; i < pookerNumber.size() ; i++){
            //先將底牌做好
            if(i < 3){
                //存到底牌去
                bottom.add( pookerNumber.get(i));
               //對索引%3判斷
            }else if(i % 3 == 0){
                //索引上的編號,發給玩家1
                player1.add( pookerNumber.get(i) );
            }else if( i % 3 == 1){
                //索引上的編號,發給玩家2
                player2.add( pookerNumber.get(i) );
            }else if( i % 3 == 2){
                //索引上的編號,發給玩家3
                player3.add( pookerNumber.get(i) );
            }
        }
        //對玩家手中的編號排序
        Collections.sort(player1);
        Collections.sort(player2);
        Collections.sort(player3);
        //看牌,將玩家手中的編號,到Map集合中查找,根據鍵找值
        //定義方法實現
        look("劉德華",player1,pooker);
        look("張曼玉",player2,pooker);
        look("林青霞",player3,pooker);
        look("底牌",bottom,pooker);
    }
    public static void look(String name,ArrayList<Integer> player,HashMap<Integer,String> pooker){
        //遍歷ArrayList集合,獲取元素,作為鍵,到集合Map中找值
        System.out.print(name+" ");
        for(Integer key : player){
            String value = pooker.get(key);
            System.out.print(value+" ");
        }
        System.out.println();
    }
 }

作業測試

1.分析以下需求,並用代碼實現:

(1)定義一個學生類Student,包含屬性:姓名(String name)、年齡(int age)
(2)定義Map集合,用Student對象作為key,用字符串(此表示表示學生的住址)作為value
(3)利用四種方式遍歷Map集合中的內容,格式:key::value
     

2.分析以下需求,並用代碼實現:

(1)利用鍵盤錄入,輸入一個字符串
(2)統計該字符串中各個字符的數量
(3)如:

    用戶輸入字符串"If~you-want~to~change-your_fate_I_think~you~must~come-to-the-dark-horse-to-learn-java"
    程序輸出結果:-(9)I(2)_(3)a(7)c(2)d(1)e(6)f(2)g(1)h(4)i(1)j(1)k(2)l(1)m(2)n(4)o(8)r(4)s(2)t(8)u(4)v(1)w(1)y(3)~(6)

20_集合_第20天(Map、可變參數、Collections)_講義