黑馬程序員_Java集合Map

Map

Map概述:

接口Map<k,v>java

類型參數:數組

k-此映射所維護的鍵的類型    v-映射值的類型數據結構

Map集合:該集合存儲鍵值對。一對一對往理存。並且要保證鍵的惟一性。app

嵌套類摘要:ide

static interface Map.Entry<k,v>  映射項(鍵-值對)this

方法摘要:spa

1,void clear():今後映射中移除全部映射關係(可選操做)。線程

2,boolean containsKey(Object Key):若是此映射包含指定鍵的映射關係,則返回true。ssr

3,boolean containsValue(Object Value):若是此映射將一個或多個鍵映射到指定值,則返回true。code

4,Set<Map.Entry<k,v>> entrySet():返回此映射中包含的映射關係的Set視圖。

5,boolean equals(Object o):比較指定的對象與此映射是否相等。

6,V get(Object key):返回指定鍵所映射的值,若是此映射不包含該鍵的映射關係,則返回null。//能夠經過get方法的返回值來判斷一個鍵是否存在。經過返回null來判斷。

7,int hashCode():返回此映射的哈希碼值。

8,boolean isEmpty():若是此映射未包含鍵值映射關係,則返回true。

9,Set<k> keyset():返回此映射中包含的鍵的Set視圖。

10,V put(K key,V value):將指定的值與此映射中的指定鍵關聯(可選操做)。//添加元素時出現相同的鍵,那麼新值會覆蓋原有鍵對應值。並會返回被覆蓋值。

11,void putAll(Map<? extends K,? extends V> m):從指定映射中將全部映射關係複製到此映射中(可選操做)。

12,V remove(Object Key):若是存在一個鍵的映射關係,則將其今後映射中移除(可選操做)。

13,int size():返回此映射中的鍵-值映射關係數。

14,Collection<V> values():返回此映射中包含的值的Collection的視圖。

 Map子類對象特色

1,HashTable:此類實現一個哈希表,該哈希表將鍵映射到相對應的值。任何非null對象均可以用做鍵或值。爲了成功地在哈希表中存儲和獲取對象,用做鍵的對象必須實現hashCode和equals方法。該集合是線程同步的。JDK1.0效率低。

2,HashMap:基於哈希表的Map接口的實現,容許使用null值和null鍵。(除了非同步和容許使用null以外,HashMap類和HashTable大體相同。)此類不保證映射的順序,特別是它不保證該順序恆久不變。該集合是不一樣步的。JDK1.2效率高。

3,TreeMap:底層是二叉樹數據結構,線程不一樣步。能夠用於給Map集合中的鍵進行排序。

和Set很像,其實Set底層就是使用了Map集合。

 Map集合的兩種取出方式

1,Set<k> keySet:講Map中全部的鍵存入到Set集合,由於set具有迭代器,因此能夠經過迭代方式取出全部的鍵,根據get的方法獲取每個鍵對應的值。

Map集合的取出原理:將Map集合轉成Set集合,再經過迭代器取出。

2,Set<Map.Entry<K,V>> entrySet:將Map集合中的映射關係存入到Set集合中,而這個關係的數據類型就是Map.Entry。

關係對象Map.Entry獲取到後,就能夠經過Map.Entry中getKey和getValue方法獲取關係中的鍵和值。

Map.Entry:其實Entry也是一個接口,它是Map接口中的一個內部接口。  

接口方法摘要:

1,boolean equals(Object o):比較指定對象與此項的相等性。

2,K getKey():返回與此項對應的鍵。

3,V getValue():返回與此項對應的值。

4,int hashCode():返回此映射項的哈希碼值。

5,V setValue(V value):用指定的值替換與此項對應的值(可選操做)。

 Map練習

 一,每個學生都有一個對應的歸屬地。學生Student,地址String。學生屬性:姓名,年齡。注意:姓名和年齡相同的視爲同一個學生。保證學生的惟一性。

 步驟:1,描述學生。2,定map容器,將學生做爲鍵,地址做爲值,存入。3,獲取map集合中的元素。

 

 

import java.util.*;
calss Student implements Comparator<Student>
{
    private String name;
    private int age;
    Student(String name,int age)
    {
        this.name = name;
        this.age = age;  
     }  
    public int CompareTo(Student s)
    {
        int num = new Integer(this.age).compareTo(new Integer(s.age));
        if(num==0)
             return this,name.compareTo(s.name);
        return num;
    }
    public int hashCode()
    {
        return name.hashCode()+age*34;
    }
    public boolean equals(Object obj)
    {
        if(!(obj instanceOf Student))
            throw ClassCastException("類型不匹配");
        Student s = (Student)obj;
        return this.name,equals(s.name) && this.age==s.age;
    }
    
    public String getName()
    {
        return name;
    }
    public int age()
    {
        return age;
    }
    public String toString()
    {
        return name+":"+age;
    }
}

calss MapTest
{
   public static void main(String [] args)
   {
        HashMap<Student,String> hm = new HashMap<Student,String>();
        hn,put(new Student("lisi1",21),"beijing");
        hn,put(new Student("lisi2",22),"shanghai");  
        hn,put(new Student("lisi3",23),"nanjing");
        hn,put(new Student("lisi4",24),"wuhan");

        //第一種取出方式 keyset
        Set<Student> ketset = hm.keyset();
        Iterator<Student> it = ketset.iterator();
        while(it.hasNext())
        {
            Student stu = it next();
            String addr = hm.get(stu);
            System.out.println(stu+".."+addr);
        }
 }         
}                    

 

//第二種取出方式:entrySet
Set<Map.Entry<Student,String>> entrySet = hm.entrySet();
Iterator<Map.Emtry<Student,String>> iter = entrySet.iterator();
while(iter.hasNext())
{
    Map.Entry<Student,String> me = iter.next();
    Student stu = me.getKey();
    String addr = me.getValue();
    System.out.println(stu+"......."+addr);   
}

 TreeMap練習一

 需求:對學生對象的年齡進行升序排序。

由於數據是以鍵值對存在的,因此要使用能夠排序的的Map集合。TreeMap。

 

import java.util.*;
class MapTest2
{
    public static void main(String [] args)
    {
        TreeMap<Student,String> tm = new TreeMap<Student,String>();
        tm.put(new Stydent("lisi3",23),"nanjing");
        tm.put(new Stydent("lisi1",21),"beijing");
        tm.put(new Stydent("lisi4",24),"wuhan");
        tm.put(new Stydent("lisi2",22),"shanghai");
        Set<Map.Entry<Student,String>> entrySet = tm.entrySet();
        Iterator<Map.Entry<Student,String>> it = entrySet.iterator();
        while(it.hasNext())
       {
            Map.Entry<Student,String> me = it.next();
            Student stu = me.getKey();
            String assr = me.getValue();
            System.out.println(stu+":::"+addr)
       }

    }
}    

 

 

 根據需求的不一樣,自定義姓名比較器。

 

class StuNameConparator implements Comparator<Student>
{
    public int compare(Student s1,Student s2)
    {
        int nun = s1.getName().compareTo(s2.getName());
        if(num==0)
            return new Integer(s1.getAge()).compareTo(new Integer(s2.getAge()));
        return num;
    }
}    
     //   TreeMap<Student,String> tm = new TreeMap<Student,String>(new StuNameConparator()); 
 
 

 

 

 

 TreeMap練習二

 "sdfgzxcvasdfxcvdf"獲取該字符串中的字母出現的次數。

但願打印結果:a(1)c(2)......

經過結果發現,每個字母都有對應的額次數。說明字母和次數之間都有映射關係。

注意了,當發現有映射關係時,能夠選擇map集合,由於map集合中存放的就是映射關係。

何時使用map集合呢?當數據之間存在這種映射關係時,就要先想map集合。

思路:

1,將字符串轉換成字符數組,由於要對每個字母進行操做。

2,定義一個map集合,由於打印結果的字母有順序,因此使用TreeMap集合。

3,遍歷字符數組。

  1,將每個字母做爲鍵去查map集合。

  2,若是返回null,將該字母和1存入到map集合中。

  3,若是返回不是null,說明該字母在map集合已經存在並有對應次數。那麼就獲取該次數並進行自增。而後將該字母和自增後的次數存入map集合中,覆蓋原來鍵所對應的值。

  4,將map集合中的數據變成指定的字符串形式返回。

import java.util.*;
class MapTest3
{
    public static void main(String [] args)
    {
        charCount("aabfcdabcdefa");
    }    

    public static String charCount(String str)
    {
        char [] chs = str.toCharArray();
        TreeMap<Chatacter,Integer> tm = new TreeMap<Character,Integer>();

    int count = 0;

    for(int x = 0;x<chs.length;x++)
    {
        if(!(chs[x]>='a' && chs[x]<='z' || chs[x]>='A' && chs[x]<='Z'))
            continue;
            
        Integer value = tm.get(chs[x]);
        
        if(value!=0)
            count = value;
        counu++;
        tm.put(chs[x],count);
        conut = 0;//用完後防止數據疊加
        /*
        if(value==null)
        {
             tm. put(chs[x],1);    
         }
        else
        {
             value = value + 1;
             tm.put(chs[x],value); 
        }
        */


    }    
    StringBulider sb = new StringBulider();
    Set<Map.Entry<Character,Integer>> entrySet =  tm.enteySet();

    Iterator<Map.Entry<Character,Integer>> it = entrySet.iterator();

    while(it.hasNext())
    {
         Map.Entry<Character,Integer> me = it.next();
         Character ch = me.getKey();
         Integer value = me.getValue();
         sb.append(ch+"("+value+")");
    }
    return sb.toString();
    }
}

 

 

 Map擴展知識

 map集合被使用是由於具有映射關係。

"yurenban" "01" "zhangsan"

"yurenban" "02" "lisi"

"jiuyeban" "01" "wangwu"

"jiuyeban" "02" "zhaoliu"

 

import java.util.*;

class MapDemo3
{
    pubilc static void main(String [] args)
    {
        HashMap<String,<String,String>> czbk = new HashMap<String,<String,String>>();

        HashMap<String,String> yure = new HashMap<String,String>();

         HashMap<String,String> jiuye = new HashMap<String,String>();

        czbk.put("yureban","yure");
        czbk.put("jiuyeban","jiuye");

        yure.put("01","zhangsan");
        yure.put("02","lisi");
       
        jiuye.put("01","zhaoliu");
        jiuye.put("02","wangwu");


        //遍歷czbk集合,獲取全部的教室。
        Iterator<String> it = czbk.keySet().iterator;
        while(it.next())
        {
            String roomName = it.next();
            HashMap<String,String> room = czbk.get(roomName);
            getStudentInfo(room);    

         }

        //getStudentInfo(yure);
    }
    pubilc ststic void getStudentInfo(HashMap<String,String> roomMap)
    {
        Iterator<String> it = roomMap.keySet().iterator();
        while(it.hasNext())
        {
            String id = it.next();
            String name = roomMap.get(id);
            System.out.println(id+":"+name); 
        }

    }





}

 在實際開發當中,一般將Student封裝成對象。代碼以下:

import java.util.*;
class Student
{
    private String id;
    private String name;
    Student(String id,String name)
    {
        this.id = id;
        this.name = name;
    }
    public String toString()
    {
        return id+":::"+name;
    }
}


class MapDemo3
{
    pubilc static void main(String[] arg)
    {
        demo();
    }   


    public static void demo()
    {
        HashMap<String,List<Student>> czbk = new HashMap<String,<Student>>();

        List<Student> yure = new ArrayList<Student>();
        List<Student> jiuye = new ArrayList<Student>();

        czbk.put("yureban",yure);
        czbk.put('jiuyeban",jiuye);

        yure.add(new Student("01","zhangsan");
        yure.add(new Student("02","wangwu");
        jiuye.add(new Student("01","zhouqi");
        jiuye.add(new Student("02","zhapliu");

        Iterator<String> it = czbk.keySet().iterator();
        while(it.hasNext())
        {
            String roomName = it.next();
            List<Student> room = czbk.get(roomName);
            System.out.println(roomName);
            getInfos(room); 
         }
    }

    public static void getInfos(List<Student> list)
    {
        Iterator<Student> it = list.iterator();
        while(it.hasNext())
        {
            Student s = it.next();
            System.out.println(s);      
        }
 
    }
}

 

 

 

 

 

 

 

 

.....

相關文章
相關標籤/搜索