5、Map集合——HashMap

小不點_發表於2020-11-13


1. Map集合概述和特點

interface Map<K,V> K:鍵的型別;V:值的型別

1.1 Map集合的特點

  • 鍵值對對映關係
  • 一個鍵對應一個值
  • 鍵不能重複,值可以重複
  • 元素存取無序

1.2 Map集合的基本使用

public class MapDemo01 { 
	public static void main(String[] args) { 
		//建立集合物件 
		Map<String,String> map = new HashMap<String,String>(); 
		//V put(K key, V value) 將指定的值與該對映中的指定鍵相關聯 
		map.put("itheima001","林青霞"); 
		map.put("itheima002","張曼玉"); 
		map.put("itheima003","王祖賢"); 
		map.put("itheima003","柳巖"); 
		
		//輸出集合物件 
		System.out.println(map); 
	} 
}

2. Map集合的基本功能

2.1 方法介紹

在這裡插入圖片描述
示例程式碼:

import java.util.HashMap;
import java.util.Map;

public class MapDemo02 {
    public static void main(String[] args) {
        //建立集合物件
        Map<String,String> map = new HashMap<String,String>();

        //V put(K key,V value):新增元素
        map.put("張無忌","趙敏");
        map.put("郭靖","黃蓉");
        map.put("楊過","小龍女");

        //V remove(Object key):根據鍵刪除鍵值對元素
//        System.out.println(map.remove("郭靖"));
//        System.out.println(map.remove("郭襄"));

        //void clear():移除所有的鍵值對元素
//        map.clear();

        //boolean containsKey(Object key):判斷集合是否包含指定的鍵
//        System.out.println(map.containsKey("郭靖"));
//        System.out.println(map.containsKey("郭襄"));

        //boolean isEmpty():判斷集合是否為空
//        System.out.println(map.isEmpty());

        //int size():集合的長度,也就是集合中鍵值對的個數
        System.out.println(map.size());


        //輸出集合物件
        System.out.println(map);
    }
}

3. Map集合的獲取功能

3.1 方法介紹

在這裡插入圖片描述

示例程式碼:

import java.util.Collection;
import java.util.HashMap;
import java.util.Map;
import java.util.Set;

/*
    Map集合的獲取功能:
        V get(Object key):根據鍵獲取值
        Set<K> keySet():獲取所有鍵的集合
        Collection<V> values():獲取所有值的集合
 */
public class MapDemo03 {
    public static void main(String[] args) {
        //建立集合物件
        Map<String, String> map = new HashMap<String, String>();

        //新增元素
        map.put("張無忌", "趙敏");
        map.put("郭靖", "黃蓉");
        map.put("楊過", "小龍女");

        //V get(Object key):根據鍵獲取值
//        System.out.println(map.get("張無忌"));
//        System.out.println(map.get("張三丰"));

        //Set<K> keySet():獲取所有鍵的集合
//        Set<String> keySet = map.keySet();
//        for(String key : keySet) {
//            System.out.println(key);
//        }

        //Collection<V> values():獲取所有值的集合
        Collection<String> values = map.values();
        for(String value : values) {
            System.out.println(value);
        }
    }
}

4. Map集合的遍歷(方式1)

  • 遍歷思路

     我們剛才儲存的元素都是成對出現的,所以我們把Map看成是一個夫妻對的集合
     1. 把所有的丈夫給集中起來
     2. 遍歷丈夫的集合,獲取到每一個丈夫
     3. 根據丈夫去找對應的妻子
    
  • 步驟分析

     獲取所有鍵的集合。用keySet()方法實現
     遍歷鍵的集合,獲取到每一個鍵。用增強for實現
     根據鍵去找值。用get(Object key)方法實現
    
  • 程式碼實現:

import java.util.HashMap;
import java.util.Map;
import java.util.Set;

public class MapDemo01 {
    public static void main(String[] args) {
        //建立集合物件
        Map<String, String> map = new HashMap<String, String>();

        //新增元素
        map.put("張無忌", "趙敏");
        map.put("郭靖", "黃蓉");
        map.put("楊過", "小龍女");

        //獲取所有鍵的集合。用keySet()方法實現
        Set<String> keySet = map.keySet();
        //遍歷鍵的集合,獲取到每一個鍵。用增強for實現
        for (String key : keySet) {
            //根據鍵去找值。用get(Object key)方法實現
            String value = map.get(key);
            System.out.println(key + "," + value);
        }
    }
}

5. Map集合的遍歷(方式2)

  • 遍歷思路

     我們剛才儲存的元素都是成對出現的,所以我們把Map看成是一個夫妻對的集合
     1. 獲取所有結婚證的集合
     2. 遍歷結婚證的集合,得到每一個結婚證
     3. 根據結婚證獲取丈夫和妻子
    
  • 步驟分析

     1. 獲取所有鍵值對物件的集合
     		* Set<Map.Entry<K,V>> entrySet():獲取所有鍵值對物件的集合
     2. 遍歷鍵值對物件的集合,得到每一個鍵值對物件
     		* 用增強for實現,得到每一個Map.Entry
     3. 根據鍵值對物件獲取鍵和值
     		*用getKey()得到鍵
     		*用getValue()得到值
    
  • 程式碼實現

import java.util.HashMap;
import java.util.Map;
import java.util.Set;

public class MapDemo02 {
    public static void main(String[] args) {
        //建立集合物件
        Map<String, String> map = new HashMap<String, String>();

        //新增元素
        map.put("張無忌", "趙敏");
        map.put("郭靖", "黃蓉");
        map.put("楊過", "小龍女");

        //獲取所有鍵值對物件的集合
        Set<Map.Entry<String, String>> entrySet = map.entrySet();
        //遍歷鍵值對物件的集合,得到每一個鍵值對物件
        for (Map.Entry<String, String> me : entrySet) {
            //根據鍵值對物件獲取鍵和值
            String key = me.getKey();
            String value = me.getValue();
            System.out.println(key + "," + value);
        }
    }
}

6. Map集合的案例

6.1 HashMap集合練習之鍵是String值是Student

案例需求:
建立一個HashMap集合,鍵是學號(String),值是學生物件(Student)。儲存三個鍵值對元素,並遍歷

  • 程式碼實現
    學生類:
public class Student {
    private String name;
    private int age;

    public Student() {
    }

    public Student(String name, int age) {
        this.name = name;
        this.age = age;
    }

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }

    public int getAge() {
        return age;
    }

    public void setAge(int age) {
        this.age = age;
    }
}

測試類:

import java.util.HashMap;
import java.util.Map;
import java.util.Set;

public class HashMapDemo {
    public static void main(String[] args) {
        //建立HashMap集合物件
        HashMap<String, Student> hm = new HashMap<String, Student>();

        //建立學生物件
        Student s1 = new Student("林青霞", 30);
        Student s2 = new Student("張曼玉", 35);
        Student s3 = new Student("王祖賢", 33);

        //把學生新增到集合
        hm.put("itheima001", s1);
        hm.put("itheima002", s2);
        hm.put("itheima003", s3);

        //方式1:鍵找值
        Set<String> keySet = hm.keySet();
        for (String key : keySet) {
            Student value = hm.get(key);
            System.out.println(key + "," + value.getName() + "," + value.getAge());
        }
        System.out.println("--------");

        //方式2:鍵值對物件找鍵和值
        Set<Map.Entry<String, Student>> entrySet = hm.entrySet();
        for (Map.Entry<String, Student> me : entrySet) {
            String key = me.getKey();
            Student value = me.getValue();
            System.out.println(key + "," + value.getName() + "," + value.getAge());
        }
    }
}

6.2 HashMap集合練習之鍵是Student值是String

案例需求:
建立一個HashMap集合,鍵是學生物件(Student),值是居住地 (String)。儲存多個元素,並遍歷。
要求保證鍵的唯一性:如果學生物件的成員變數值相同,我們就認為是同一個物件

  • 程式碼實現
    學生類:
public class Student {
    private String name;
    private int age;

    public Student() {
    }

    public Student(String name, int age) {
        this.name = name;
        this.age = age;
    }

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }

    public int getAge() {
        return age;
    }

    public void setAge(int age) {
        this.age = age;
    }

    @Override
    public boolean equals(Object o) {
        if (this == o) return true;
        if (o == null || getClass() != o.getClass()) return false;

        Student student = (Student) o;

        if (age != student.age) return false;
        return name != null ? name.equals(student.name) : student.name == null;
    }

    @Override
    public int hashCode() {
        int result = name != null ? name.hashCode() : 0;
        result = 31 * result + age;
        return result;
    }
}

測試類:

import java.util.HashMap;
import java.util.Set;

public class HashMapDemo {
    public static void main(String[] args) {
        //建立HashMap集合物件
        HashMap<Student, String> hm = new HashMap<Student, String>();

        //建立學生物件
        Student s1 = new Student("林青霞", 30);
        Student s2 = new Student("張曼玉", 35);
        Student s3 = new Student("王祖賢", 33);
        Student s4 = new Student("王祖賢", 33);

        //把學生新增到集合
        hm.put(s1, "西安");
        hm.put(s2, "武漢");
        hm.put(s3, "鄭州");
        hm.put(s4, "北京");

        //遍歷集合
        Set<Student> keySet = hm.keySet();
        for (Student key : keySet) {
            String value = hm.get(key);
            System.out.println(key.getName() + "," + key.getAge() + "," + value);
        }
    }
}

6.3 集合巢狀之ArrayList巢狀HashMap

案例需求:
建立一個ArrayList集合,儲存三個元素,每一個元素都是HashMap
每一個HashMap的鍵和值都是String,並遍歷。

  • 程式碼實現:
import java.util.ArrayList;
import java.util.HashMap;
import java.util.Set;

/*
    需求:
        建立一個ArrayList集合,儲存三個元素,每一個元素都是HashMap,每一個HashMap的鍵和值都是String,並遍歷

    思路:
        1:建立ArrayList集合
        2:建立HashMap集合,並新增鍵值對元素
        3:把HashMap作為元素新增到ArrayList集合
        4:遍歷ArrayList集合

    給出如下的資料:
        第一個HashMap集合的元素:
  		    孫策		大喬
  		    周瑜		小喬
        第二個HashMap集合的元素:
  		    郭靖		黃蓉
  		    楊過		小龍女
        第三個HashMap集合的元素:
  		    令狐沖	任盈盈
  		    林平之	嶽靈珊
 */
public class ArrayListIncludeHashMapDemo {
    public static void main(String[] args) {
        //建立ArrayList集合
        ArrayList<HashMap<String, String>> array = new ArrayList<HashMap<String, String>>();

        //建立HashMap集合,並新增鍵值對元素
        HashMap<String, String> hm1 = new HashMap<String, String>();
        hm1.put("孫策", "大喬");
        hm1.put("周瑜", "小喬");
        //把HashMap作為元素新增到ArrayList集合
        array.add(hm1);

        HashMap<String, String> hm2 = new HashMap<String, String>();
        hm2.put("郭靖", "黃蓉");
        hm2.put("楊過", "小龍女");
        //把HashMap作為元素新增到ArrayList集合
        array.add(hm2);

        HashMap<String, String> hm3 = new HashMap<String, String>();
        hm3.put("令狐沖", "任盈盈");
        hm3.put("林平之", "嶽靈珊");
        //把HashMap作為元素新增到ArrayList集合
        array.add(hm3);

        //遍歷ArrayList集合
        for (HashMap<String, String> hm : array) {
            Set<String> keySet = hm.keySet();
            for (String key : keySet) {
                String value = hm.get(key);
                System.out.println(key + "," + value);
            }
        }
    }
}

6.4 集合巢狀之HashMap巢狀ArrayList

案例需求:
建立一個HashMap集合,儲存三個鍵值對元素,每一個鍵值對元素的鍵是String,值是ArrayList
每一個ArrayList的元素是String,並遍歷。

  • 程式碼實現
import java.util.ArrayList;
import java.util.HashMap;
import java.util.Set;

/*
    需求:建立一個HashMap集合,儲存三個鍵值對元素,每一個鍵值對元素的鍵是String,值是ArrayList,
         每一個ArrayList的元素是String,並遍歷

    思路:
        1:建立HashMap集合
        2:建立ArrayList集合,並新增元素
        3:把ArrayList作為元素新增到HashMap集合
        4:遍歷HashMap集合

    給出如下的資料:
        第一個ArrayList集合的元素:(三國演義)
  		    諸葛亮
  		    趙雲
        第二個ArrayList集合的元素:(西遊記)
  		    唐僧
  		    孫悟空
        第三個ArrayList集合的元素:(水滸傳)
  		    武松
  		    魯智深
*/
public class HashMapIncludeArrayListDemo {
    public static void main(String[] args) {
        //建立HashMap集合
        HashMap<String, ArrayList<String>> hm = new HashMap<String, ArrayList<String>>();

        //建立ArrayList集合,並新增元素
        ArrayList<String> sgyy = new ArrayList<String>();
        sgyy.add("諸葛亮");
        sgyy.add("趙雲");
        //把ArrayList作為元素新增到HashMap集合
        hm.put("三國演義",sgyy);

        ArrayList<String> xyj = new ArrayList<String>();
        xyj.add("唐僧");
        xyj.add("孫悟空");
        //把ArrayList作為元素新增到HashMap集合
        hm.put("西遊記",xyj);

        ArrayList<String> shz = new ArrayList<String>();
        shz.add("武松");
        shz.add("魯智深");
        //把ArrayList作為元素新增到HashMap集合
        hm.put("水滸傳",shz);

        //遍歷HashMap集合
        Set<String> keySet = hm.keySet();
        for(String key : keySet) {
            System.out.println(key);
            ArrayList<String> value = hm.get(key);
            for(String s : value) {
                System.out.println("\t" + s);
            }
        }
    }
}

6.5 統計字串中每個字元出現的次數

案例需求:
鍵盤錄入一個字串,要求統計字串中每個字串出現的次數。
舉例:鍵盤錄入“aababcabcdabcde” 在控制檯輸出:“a(5)b(4)c(3)d(2)e(1)”

  • 程式碼實現
import java.util.HashMap;
import java.util.Scanner;
import java.util.Set;
import java.util.TreeMap;

/*
    思路:
        1:鍵盤錄入一個字串
        2:建立HashMap集合,鍵是Character,值是Integer
        3:遍歷字串,得到每一個字元
        4:拿得到的每一個字元作為鍵到HashMap集合中去找對應的值,看其返回值
            如果返回值是null:說明該字元在HashMap集合中不存在,就把該字元作為鍵,1作為值儲存
            如果返回值不是null:說明該字元在HashMap集合中存在,把該值加1,然後重新儲存該字元和對應的值
        5:遍歷HashMap集合,得到鍵和值,按照要求進行拼接
        6:輸出結果
 */
public class HashMapDemo {
    public static void main(String[] args) {
        //鍵盤錄入一個字串
        Scanner sc = new Scanner(System.in);
        System.out.println("請輸入一個字串:");
        String line = sc.nextLine();

        //建立HashMap集合,鍵是Character,值是Integer
//        HashMap<Character, Integer> hm = new HashMap<Character, Integer>();
        TreeMap<Character, Integer> hm = new TreeMap<Character, Integer>();

        //遍歷字串,得到每一個字元
        for (int i = 0; i < line.length(); i++) {
            char key = line.charAt(i);

            //拿得到的每一個字元作為鍵到HashMap集合中去找對應的值,看其返回值
            Integer value = hm.get(key);

            if (value == null) {
                //如果返回值是null:說明該字元在HashMap集合中不存在,就把該字元作為鍵,1作為值儲存
                hm.put(key,1);
            } else {
                //如果返回值不是null:說明該字元在HashMap集合中存在,把該值加1,然後重新儲存該字元和對應的值
                value++;
                hm.put(key,value);
            }
        }

        //遍歷HashMap集合,得到鍵和值,按照要求進行拼接
        StringBuilder sb = new StringBuilder();

        Set<Character> keySet = hm.keySet();
        for(Character key : keySet) {
            Integer value = hm.get(key);
            sb.append(key).append("(").append(value).append(")");
        }

        String result = sb.toString();

        //輸出結果
        System.out.println(result);
    }
}

相關文章