1. 程式人生 > >java學習--day14--Map

java學習--day14--Map

Map

為了方便存取鍵值對關係的資料,引入Map集合,資料的查重只和鍵有關,和值無關

和Collection想比,前者屬於單列集合,而後者屬於雙列集合

一.HashMap

底層資料結構是雜湊表HashMap,允許使用null值和null鍵,如果鍵相同,則值覆蓋,返回上一次的值

put();   往Map集合中新增鍵和值

clear();  清空全部元素

remove();  刪除某一個鍵,根據鍵刪除整個鍵值對

get();  根據鍵找到鍵值對

values();  將所有值放入一個Collection中,得到所有的值

set();   獲取所有的鍵,放入一個Set中

size();   獲取集合的長度

遍歷map集合的方式,

1.方式一:鍵找值,通過方法得到key集合,進行遍歷通過key找到value

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

public class HashMapDemo1 {
    public static void main(String[] args) {
        HashMap<Integer, String> map = new HashMap<>();
        map.put(001, "奧特之父");
        map.put(002, "皮");
        map.put(003, "99號技師");
        map.put(004, "大熊貓");
        map.put(005, "我叫圓圓高");
        Set<Integer> keys = map.keySet();

        for(Integer key: keys) {
            System.out.println(key + "---" + map.get(key));
        }
    }
}

方法:entrySet();然後遍歷鍵值對物件集合

getKey();     getValue();   通過物件呼叫方法獲取鍵和值

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

public class MapDemo4 {
    public static void main(String[] args) {
        Map<String, String> hm = new HashMap<String, String>();
        map.put(001, "奧特之父");
        map.put(002, "皮");
        map.put(003, "99號技師");
        map.put(004, "大熊貓");
        map.put(005, "我叫圓圓高");
       
        Set<Map.Entry<String, String>> entries = hm.entrySet();
        for (Map.Entry<String, String> entry : entries) {
            String key = entry.getKey();
            String value = entry.getValue();
            System.out.println(key + "===" + value);
        }
    }
}

關於鍵和值的儲存:如果鍵不同,就算值一樣也能存進去,如果鍵相同,則要看鍵是基本型別還是引用型別,因為引用型別建立物件地址值是不同的,如果想要引用型別的鍵不可重複,則要重寫equals方法和hashcode方法(原理和HashSet一樣)

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

public class HashMapDemo4 {
    public static void main(String[] args) {
        HashMap<Student, String> hm = new HashMap<>();
        hm.put(new Student("Lucy",18),"s001");
        hm.put(new Student("Jack", 40), "s002");
        hm.put(new Student("Mary", 40), "s002");
        hm.put(new Student("Lucy", 40), "s002");
        hm.put(new Student("White", 40), "s002");
        hm.put(new Student("BOb", 40), "s003");
        hm.put(new Student("Jack", 40), "s007");
        //map集合的資料結構跟鍵有關
        Set<Student> students = hm.keySet();
        for(Student student:students){
            String s = hm.get(student);
            System.out.println(student.getName()+"==="+s);
        }
    }
}


import java.util.Objects;

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;
        return age == student.age &&
                Objects.equals(name, student.name);
    }

    @Override
    public int hashCode() {

        return Objects.hash(name, age);
    }

    @Override
    public String toString() {
        return "Student{" +
                "name='" + name + '\'' +
                ", age=" + age +
                '}';
    }
}

LinkedHashMap:有序(儲存順序)不可重複,底層是連結串列和雜湊表,和前面例子大致相同,只是輸出結果按輸入順序輸出

TreeMap:有序(按照鍵排序)不可重複,底層是二叉樹和雜湊表,不允許存入null鍵,可以存入null值

同樣的有兩種比較方法:有參和無參;原理和上一篇部落格中的TreeSet一樣,需要實現介面和重寫方法,在此不再作過多贅述,用有參構造進行演示

import java.util.Comparator;
import java.util.Map;
import java.util.Set;
import java.util.TreeMap;

public class TreeMapTest1 {
    public static void main(String[] args) {
        TreeMap<Student, Integer> stuTree = new TreeMap<>(new Comparator<Student>() {

            @Override
            public int compare(Student o1, Student o2) {
                int result = o1.getAge() - o2.getAge();
                int lastResult = result == 0 ? o1.getName().compareTo(o2.getName()) : result;
                return lastResult;
            }
        });

        stuTree.put(new Student("奧特之父", 20), 001);
        stuTree.put(new Student("你捅我兩刀吧", 20), 001);
        stuTree.put(new Student("007", 21), 001);
        stuTree.put(new Student("奧特之父", 20), 003);
        stuTree.put(new Student("大熊貓", 22), 004);

        Set<Map.Entry<Student, Integer>> entries = stuTree.entrySet();
        for(Map.Entry<Student, Integer> entry: entries) {
            Student stu = entry.getKey();
            Integer i = entry.getValue();
            System.out.println(stu.getName() + "---" + stu.getAge() + "---" + i);
        }
    }
}


public class Student {

    private String name;
    private int age;

    
    構造方法
    ...
    ...
    重寫方法

}

例題:判斷字元出現頻度,"aababcabcdabcde", 獲取字串中每一個字母出現的次數要求結果:a(5) b(4) c(3) d(2) e(1)

import javax.sound.midi.Soundbank;
import java.util.HashMap;
import java.util.Scanner;
import java.util.Set;

public class MyMapDemo {

    public static void main(String[] args) {
        HashMap<Character, Integer> map = new HashMap<>();
        Scanner sc = new Scanner(System.in);
        System.out.println("請隨便輸入一段字串");
        String line = sc.next();

        for (int i = 0; i < line.length(); i++) {
            //獲取單個字元
            char key = line.charAt(i);

            if (map.get(key) == null) { //第一次存入資料,將null改為1
                map.put(key, 1);
            } else {  //如果不是第一次輸入,則將值加1即可
                Integer value = map.get(key);
                value++;
                map.put(key, value);
            }
        }

        //遍歷集合拼串
        StringBuffer sb = new StringBuffer();
        Set<Character> characters = map.keySet();
        for(Character ch:characters){
            sb.append(ch).append("(").append(map.get(ch)).append(")");
        }
        String s = sb.toString();
        System.out.println("你要的結果"+s);
    }
}

加強:HashMap的巢狀
 

//儲存下列資料
//基礎班
        //     張三   20
        //     李四   22

 //就業班
        //    王五    21
        //    趙六    23
        
import java.util.HashMap;
import java.util.Set;

public class MapDemo2 {

    public static void main(String[] args) {
        //HashMap  巢狀  HashMap
        HashMap<String, Integer> jc = new HashMap<>();
        jc.put("張三", 20);
        jc.put("李四", 22);
        HashMap<String, Integer> jy = new HashMap<>();
        jy.put("王五", 21);
        jy.put("趙六", 23);

        //建立一個map集合
        HashMap<String, HashMap<String, Integer>> bigMap = new HashMap<>();
        bigMap.put("基礎班", jc);
        bigMap.put("就業班", jy);

        //遍歷 鍵找值
        Set<String> keys = bigMap.keySet();
        for (String k : keys) {
            System.out.println(k);
            HashMap<String, Integer> value = bigMap.get(k);
            Set<String> strings = value.keySet();
            for (String s : strings) {
                System.out.println("\t" + s + "==" + value.get(s));
            }
            System.out.println();
        }
    }
}

巢狀的再次練習

//儲存下列資料
//三國演義
        //        呂布
        //        周瑜
// 笑傲江湖
        //        令狐沖
        //        林平之
//神鵰俠侶
        //      郭靖
        //      楊過

import java.net.SocketTimeoutException;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.Map;
import java.util.Set;

public class MyMapDemo3 {

    public static void main(String[] args) {  
        //把上面這組資料存起來  HashMap 巢狀List
        ArrayList<String> sgyy = new ArrayList<>();
        sgyy.add("呂布");
        sgyy.add("周瑜");
        ArrayList<String> xajh = new ArrayList<>();
        xajh.add("令狐沖");
        xajh.add("林平之");
        ArrayList<String> sdxl = new ArrayList<>();
        sjxl.add("郭靖");
        sjxl.add("楊過");

        HashMap<String, ArrayList<String>> hm = new HashMap<>();
        hm.put("笑傲江湖", xajh);
        hm.put("神鵰俠侶", sdxl);
        hm.put("三國演義", sgyy);

        //遍歷
        Set<Map.Entry<String, ArrayList<String>>> entries = hm.entrySet();
        for (Map.Entry<String, ArrayList<String>> en : entries) {
            String key = en.getKey();
            System.out.println(key);
            ArrayList<String> value = en.getValue();
            for (String k : value) {
                System.out.println("\t"+k);
            }

            System.out.println();
        }
    }
}

集合中 collections常用方法:

集合的排序:new一個比較器,用比較器排序

二分查詢:bianrySearch()

最大值最小值:max(),min()

元素反轉:reverse();

隨即打亂集合中的元素:shuffle();