黑馬程式設計師java筆記之一-----Map集合

weixin_34219944發表於2012-12-25

Map集合:該集合儲存鍵值對。一對一對往裡存,而且要保證鍵的唯一性

            1.  新增:
                put(k key,v value)
                putAll(Map<? extends k,?extends v>m)  從指定對映中將所有對映關係複製到此對映中(可選操作)。

            2.  刪除
                 clear()
                 remove(Object key)
            3. 判斷
                 containsValue(Object value)
                 containKey(Object key)
                 isEmpty()
            4.獲取
                 get(Object key)
                 size()
                 value()  從指定對映中將所有對映關係複製到此對映中(可選操作)。

                Map
                 |---Hashtable
                                 此類實現一個雜湊表,該雜湊表將對映到相應的值。不可以存入null值和null鍵。jdk1.0,效率高
                                 為了成功地在雜湊表中儲存和獲取物件,用作鍵的物件必須實現hashCode方法和equals方法.

                                   從Java 2 平臺 v1.2起,此類就被改進以實現Map 介面,使它成為 Java Collections Framework

                                 中的一個成員。不像新的 collection 實現,Hashtable 是同步的,底層是雜湊表資料結構。

                  |---HashMap 底層表示雜湊表資料結構,允許使用null值和null值,該集合是不同步的。
                  |---TreeMap :底層是二叉樹結構。執行緒不同步。可以用於給map集合中的鍵進行排序。
                               和set比較:Set底層就是使用了Map集合。

[java] view plaincopy
  1. <span style="font-size:18px;">import java.io.ObjectOutputStream.PutField;  
  2. import java.util.Collection;  
  3. import java.util.HashMap;  
  4. import java.util.Map;  
  5.   
  6. public class MapTest {  
  7.     public static void main(String[] args){  
  8.         Map<String, String> map=new HashMap<String, String>();  
  9.         //新增元素,如果出現相同的鍵,那麼後新增的值會覆蓋原有鍵對應值,並put方法會返回被覆蓋的值。  
  10.         System.out.println("map:"+map.put("01""zhang"));  
  11.         System.out.println("map:"+map.put("01""wsufn"));  
  12.         map.put("02""li");  
  13.         map.put("03""sun");  
  14.         map.put(null"hehe");  
  15.         map.put(nullnull);//  
  16.         map.put(null,"woish");  
  17.         map.put("04"null);  
  18.         map.put("05"null);//只允許存在一個null鍵,可以存在一個或多個null值  
  19.         System.out.println(map.containsKey("01"));  
  20.         System.out.println("get:"+map.get("03"));  
  21.         //可以通過get方法的返回值來判斷一個鍵是否存在  
  22.         System.out.println(map);  
  23.         Collection<String> coll=map.values();  
  24.         // Collection<V> values() 返回此對映所包含的值的 Collection 檢視。  
  25.         System.out.println(coll);  
  26.     }  
  27.   
  28. }</span>  

map集合的兩種取出方式:
       一、Set<k> keySet:將map中所有的鍵存入到Set集合。因為set具備迭代器。
         所有可以迭代方式取出所有的鍵,在根據get方法。獲取每一個鍵對應的值。
     

[java] view plaincopy
  1. <span style="font-size:18px;">  Map集合的取出原理:將map集合轉成set集合。再通過迭代器取出。  
  2.        public class MapTest {  
  3.            public static void main(String[] args){  
  4.                Map<String, String> map=new HashMap<String, String>();  
  5.                map.put("02""li");  
  6.                map.put("03""sun");  
  7.               Set<String> keyset= map.keySet();  
  8.                // Collection<V> values() 返回此對映所包含的值的 Collection 檢視。  
  9.              //有了Set集合,就可以獲取迭代器  
  10.               Iterator<String> it=keyset.iterator();  
  11.              while (it.hasNext()) {  
  12.               String str =(String)it.next();  
  13.                String value=map.get(str);//得到key對應的值  
  14.               System.out.println("key:"+str);//得到值,而沒有得到鍵  
  15.               }  
  16.   }  
  17. }</span>  


二、Set<Map.Entry<k,v>> entrySet: 將map集合中的對映關係取出,存入到集合中

[java] view plaincopy
  1.      public class MapTest {  
  2.         public static void main(String[] args){  
  3.         Map<String, String> map=new HashMap<String, String>();  
  4.         map.put("02""li");  
  5.         map.put("03""sun");  
  6.         Set<Map.Entry<String, String>> entry=map.entrySet();  
  7.         Iterator<Map.Entry<String,String>> it=entry.iterator();  
  8.         while (it.hasNext()) {  
  9.         Map.Entry<String, String>  me=it.next();  
  10.         String key= me.getKey();  
  11.         String value=me.getValue();  
  12.         System.out.println("key:"+key+",value:"+value);  
  13.            }  
  14.     }  
  15. }  

註明:Map.Entry()其實Entry也是一個介面,它是Map介面中的一個內部介面。
練習:
 因為資料是以鍵值對形式存在的。
 所以要使用可以排序的Map集合。TreeMap。

[java] view plaincopy
  1. <span style="font-size:18px;">import java.util.*;  
  2.   
  3. class A implements Comparator<Student>  
  4. {  
  5.     public int compare(Student s1,Student s2)  
  6.     {  
  7.         int num = s1.getName().compareTo(s2.getName());  
  8.         if(num==0)  
  9.             return new Integer(s1.getAge()).compareTo(new Integer(s2.getAge()));  
  10.             return num;  
  11.     }  
  12. }  
  13. class  MapTest  
  14. {  
  15.     public static void main(String[] args)  
  16.     {  
  17.         TreeMap<Student,String> tm = new TreeMap<Student,String>(new StuNameComparator());  
  18.          map.put("02""li");  
  19.          map.put("03""sun");  
  20. //   第一種方法:keySet  
  21.              Set<Student> keySet=tm.keySet();  
  22.              Iterator<String > it=keyset.iterator();  
  23.         while(it.hasNext()){  
  24.         Student stu=it.next();  
  25.         String addr=tm.get(stu);  
  26.         System.out.println(stu+".."+addr);  
  27.             }  
  28.   
  29. //   第二種方法: entrySet:  
  30.           
  31.         Set<Map.Entry<Student,String>> entrySet = tm.entrySet();  
  32.   
  33.         Iterator<Map.Entry<Student,String>> it = entrySet.iterator();  
  34.   
  35.         while(it.hasNext())  
  36.         {  
  37.             Map.Entry<Student,String> me = it.next();  
  38.   
  39.             Student stu = me.getKey();  
  40.             String addr = me.getValue();  
  41.             System.out.println(stu+":::"+addr);  
  42.         }  
  43.     }  
  44. }</span>  

練習:
"sdfgzxcvasdfxcvdf"獲取該字串中的字母出現的次數。
希望列印結果:a(1)c(2).....
通過結果發現,每一個字母都有對應的次數。說明字母和次數之間都有對映關係。

注意,當發現有對映關係時,可以選擇map集合。因為map集合中存放就是對映關係。
什麼使用map集合呢?
當資料之間存在這對映關係時,就要先想map集合。

思路:
1,將字串轉換成字元陣列。因為要對每一個字母進行操作。
2,定義一個map集合,因為列印結果的字母有順序,所以使用treemap集合。
3,遍歷字元陣列。
    將每一個字母作為鍵去查map集合。
    如果返回null,將該字母和1存入到map集合中。
    如果返回不是null,說明該字母在map集合已經存在並有對應次數。
    那麼就獲取該次數並進行自增。,然後將該字母和自增後的次數存入到map集合中。覆蓋呼叫原理鍵所對應的值。
4,將map集合中的資料變成指定的字串形式返回。

[java] view plaincopy
  1. <span style="font-size:18px;">class  MapTest  
  2. {  
  3.     public static void main(String[] args)   
  4.     {  
  5.         String s= charCount("wefsdfefdc,sedffe-fsd");  
  6.         System.out.println(s);  
  7.     }  
  8.     public static String charCount(String str)  
  9.     {  
  10.         char[] chs = str.toCharArray();  
  11.         TreeMap<Character,Integer> tm = new TreeMap<Character,Integer>();  
  12.         int count = 0;  
  13.         for(int x=0; x<chs.length; x++)  
  14.         {  
  15.                      if(!(chs[x]>='a' && chs[x]<='z' || chs[x]>='A' && chs[x]<='Z'))  
  16.               continue;  
  17.                     Integer value = tm.get(chs[x]);  
  18.             if(value!=null)  
  19.             count = value;  
  20.             count++;  
  21.             tm.put(chs[x],count);//直接往集合中儲存字元和數字,因為自動裝箱。  
  22.   
  23.             count = 0;  
  24.             /* 
  25.             if(value==null) 
  26.             { 
  27.                 tm.put(chs[x],1); 
  28.             } 
  29.             else 
  30.             { 
  31.                 value = value + 1; 
  32.                 tm.put(chs[x],value); 
  33.             } 
  34.             */  
  35.  }  
  36.                 StringBuilder sb = new StringBuilder();  
  37.                 Set<Map.Entry<Character,Integer>> entrySet = tm.entrySet();  
  38.         Iterator<Map.Entry<Character,Integer>>  it = entrySet.iterator();  
  39.                 while(it.hasNext())  
  40.         {  
  41.             Map.Entry<Character,Integer> me = it.next();  
  42.             Character ch = me.getKey();  
  43.             Integer value = me.getValue();  
  44.             sb.append(ch+"("+value+")");  
  45.         }  
  46.         return sb.toString();  
  47.     }  
  48. }</span>  

相關文章