Java中的Map

2年前 (2022) 程序员胖胖胖虎阿
213 0 0

Map

  • 5.1Map集合的概述和使用
    • 5.1.1HashMap的put方法
  • 5.2 Map集合的基本功能
  • 5.3 Map集合的获取功能
  • 5.4 Map集合的遍历(方式1:将键获取到一个集合,再将键的集合遍历获取对应的值)
  • 5.5 Map集合的遍历(方式2:获取键值对象Map.Entry,然后遍历)
  • 5.7 案例:HashMap集合存储集合对象并遍历(保证键唯一,在类中重写equals()和hashCode()方法)
  • 5.8 案例:ArrayList集合存储HashMap元素并遍历
  • 5.9 案例:HashMap集合存储ArrayList元素并遍历
  • 5.10 案例:统计字符串中每个字符出现的次数

5.1Map集合的概述和使用

Interface Map<K,V>
K:Map集合中key的类型
V:Map集合中value的类型
All Known Implementing Classes:
AbstractMap, Attributes, AuthProvider, ConcurrentHashMap, ConcurrentSkipListMap, EnumMap, HashMap, Hashtable, Headers, IdentityHashMap, LinkedHashMap, PrinterStateReasons, Properties, Provider, RenderingHints, SimpleBindings, TabularDataSupport, TreeMap, UIDefaults, WeakHashMap

public interface Map<K,V> {}
1.Interface Map<K,V>
K:Map集合中key的类型
V:Map集合中value的类型

2.将键映射到值得对象,Map不能包含重复的键,每个键可以映射到最多一个值

3.举例:学生的学号和姓名
student1 “anna”
student2 “tom”
student3 “we”

创建Map结合的对象:
因为Map是接口,不能直接创建对象,所以我们使用多态的方式来创建.在这里我们可以创建实现类HashMap的对象

5.1.1HashMap的put方法

举例:学生的学号和姓名
student1 “anna”
student2 “tom”
student3 “we”

HashMap的元素的添加我们使用put方法,注意如果key一次出现时是添加此元素,如果key第二次出现时,是修改元素.

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

public class MapDemo {
    public static void main(String[] args) {
        Map<String,String> map=new HashMap<>();
        map.put("student1","anna");
        map.put("student2","tom");
        map.put("student3","we");
        map.put("student3","change");

        System.out.println(map);
    }
}

输出结果:

{student2=tom, student1=anna, student3=change}

注意:
这里的HashMap重写了toString方法,这里的输出结果用=号连接.
key第二次出现时,value会覆盖.

5.2 Map集合的基本功能

方法名 说明
V put(K key,V value) 添加元素
V remove(Object key) 根据键删除键值对元素
void clear() 删除Map集合中所有的元素
boolean containsKey(Object value) 判断集合是否包含指定的值
boolean isEmpty() 判断集合是否为空
int size() 集合的长度,也就是集合中键值对的个数
import java.util.HashMap;
import java.util.Map;

public class MapDemo01 {
    public static void main(String[] args) {
        Map<String,String> m=new HashMap<String,String>();

        m.put("zwj","zm");
        m.put("gj","hr");
        m.put("yg","xln");

        m.remove("zwj");
        System.out.println(m);
        System.out.println(m.containsKey("gj"));
        System.out.println(m.containsValue("zm"));
        System.out.println(m.isEmpty());
        System.out.println(m.size());
        m.clear();
        System.out.println(m.size());

    }
}

输出结果:

{gj=hr, yg=xln}
true
false
false
2
0

5.3 Map集合的获取功能

方法名 说明
V get(Object key) 根据键获取值
SetkeySet() 获取所有键的集合
Collectionvalues() 获取所有值的集合
Set<Map.Entry<K,V>>entrySet() 获取所有键值对象的集合
import java.util.Collection;
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("first","anan");
        map.put("second","bob");
        map.put("third","cow");
        map.put("fourth","dead");

        System.out.println(map.get("fourth"));
        System.out.println("-----");
        System.out.println(map.keySet());
        Set<String> ketSet=map.keySet();
        for(String s:ketSet){
            System.out.println(s);
        }
        System.out.println("-----");

        System.out.println(map.values());
        Collection<String> collection=map.values();
        for(String s:collection){
            System.out.println(s);
        }
        System.out.println("-----");
        System.out.println(map.entrySet());
        Set<Map.Entry<String,String>> setMapEntry = map.entrySet();
        System.out.println(setMapEntry);
    }
}

输出结果:

dead
-----
[third, fourth, first, second]
third
fourth
first
second
-----
[cow, dead, anan, bob]
cow
dead
anan
bob
-----
[third=cow, fourth=dead, first=anan, second=bob]
[third=cow, fourth=dead, first=anan, second=bob]

5.4 Map集合的遍历(方式1:将键获取到一个集合,再将键的集合遍历获取对应的值)

Map存储的元素都是键值对的形式成对出现的.
遍历思路:
1、把所有键的放到一个集合;
2、遍历键的集合,获取到每一个键;
3、根据键的获取到键对应的每一个值。
转换成Map结合中的操作为:
1、Set.setKey()
2、for()
3、V get(Object key)

import java.util.*;

public class MapSimple01 {
    public static void main(String[] args) {
        Map<Integer,String> mapStudent=new HashMap<Integer,String>();
        mapStudent.put(1,"A");
        mapStudent.put(2,"B");
        mapStudent.put(3,"C");
        mapStudent.put(4,"C");
        mapStudent.put(5,"D");

        System.out.println(mapStudent);
        Set<Integer> studentNumSet = mapStudent.keySet();
        for(int key:studentNumSet){
            String value=mapStudent.get(key);
            System.out.println(key+"="+value);
        }
    }
}

输出结果:


{1=A, 2=B, 3=C, 4=C, 5=D}
1=A
2=B
3=C
4=C
5=D

5.5 Map集合的遍历(方式2:获取键值对象Map.Entry,然后遍历)

Map存储的集合都是键值对的形式成对出现的,所以我们可以将键值对看成一个大的集合。
遍历思路:
1、获取所有键值对的集合
2、遍历键值对集合,得到每一个键值对
3、根据键值对,分别获取键和值
转换成Map集合中的操作:
1、获取所有键值对对象的集合;
Set<Map.Entry<K,V>>entrySet():获取所有键值对对象的集合
2、遍历键值对对象的集合,得到每一个键值对对象
用增强for循环实现,得到每一个Map.Entry
3、根据键值对对象获取键和值
用getKey()获取键;
用getValue()获取值。

package daily_Map;

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

public class MapSimple02 {
    public static void main(String[] args) {
        Map<Integer,String> mapCircle=new HashMap<>();
        mapCircle.put(1,"A");
        mapCircle.put(2,"B");
        mapCircle.put(3,"C");
        mapCircle.put(4,"C");
        mapCircle.put(5,"D");

        System.out.println(mapCircle);

        Set<Map.Entry<Integer,String>> mapEntrySet =mapCircle.entrySet();
        for(Map.Entry<Integer,String> me:mapEntrySet){
            Integer meKey=me.getKey();
            String meValue=me.getValue();
            System.out.println(meKey);
            System.out.println(meValue);
        }
    }
}
输出结果:

```java
{1=A, 2=B, 3=C, 4=C, 5=D}
1
A
2
B
3
C
4
C
5
D

# 5.6 案例:HashMap集合存储学生对象并遍历
需求:创建一个HashMap集合,键是学号String,值是学生对象Student。存储三个键值元素,并遍历。
思路:
1.定义学生类
2.创建HashMap集合
3.创建学生对象
4.将学生对象添加到集合中
5.遍历集合
	遍历方式1:根据键找值
	遍历方式2:根据键值对象找键和值
```java
package daily_Map;

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

public class MapSimpleObj {
    public static void main(String[] args) {
        Map<String,Student> hashMapStudent=new HashMap<>();
        Student s1=new Student("LUNA",10);
        Student s2=new Student("BOB",12);
        Student s3=new Student("Cathy",45);
        Student s4=new Student("David",54);

        hashMapStudent.put("202201",s1);
        hashMapStudent.put("202202",s2);
        hashMapStudent.put("202203",s3);
        hashMapStudent.put("202204",s4);

        System.out.println(hashMapStudent);
        Set<String> keySet=hashMapStudent.keySet();
        for (String key:keySet){
            Student value=hashMapStudent.get(key);
            System.out.println(key+":"+value.getName()+"+"+value.getAge());
        }
        System.out.println("-------------------------");
        Set<Map.Entry<String,Student>> hashMapEntry=hashMapStudent.entrySet();
        for (Map.Entry<String, Student> hme:hashMapEntry){
            String key=hme.getKey();
            String valueName=hme.getValue().getName();
            Integer valueAge=hme.getValue().getAge();
            System.out.println(key+":"+valueName+","+valueAge);
        }
    }
}

输出结果:

{202201=daily_Map.Student@4554617c, 202204=daily_Map.Student@74a14482, 202202=daily_Map.Student@1540e19d, 202203=daily_Map.Student@677327b6}
202201:LUNA+10
202204:David+54
202202:BOB+12
202203:Cathy+45
-------------------------
202201:LUNA,10
202204:David,54
202202:BOB,12
202203:Cathy,45

5.7 案例:HashMap集合存储集合对象并遍历(保证键唯一,在类中重写equals()和hashCode()方法)

需求:创建一个HashMap集合,键是学生对象Student,值是居住地String。存储多个键值对元素,并遍历。
要求保证键的唯一性:如果学生对象的成员变量值相同,我们就认为是同一个对象。
思路:
1.定义学生类
2.创建HashMap集合对象
3.创建学生对象
4.把学生添加到集合
5.遍历集合
6.在学生类中重写两个方法来保证键的唯一性
hashCode();
equals();

package daily_Map;

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;
    }
}

package daily_Map;

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

public class MapSimpleKeyUnique {
    public static void main(String[] args) {
        HashMap<Student,String> hm =new HashMap<>();
        Student s1=new Student("LUNA",10);
        Student s2=new Student("BOB",12);
        Student s3=new Student("Cathy",45);
        Student s4=new Student("David",54);
        Student s5=new Student("David",54);

        hm.put(s1,"西安");
        hm.put(s2,"武汉");
        hm.put(s3,"郑州");
        hm.put(s4,"北京");
        hm.put(s5,"长沙");

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

输出结果:

David,54,长沙
Cathy,45,郑州
LUNA,10,西安
BOB,12,武汉

如果Student类中不重写hashCod()和equals()方法,输出的结果为:

BOB,12,武汉
David,54,北京
LUNA,10,西安
Cathy,45,郑州
David,54,长沙

5.8 案例:ArrayList集合存储HashMap元素并遍历

需求:创建一个ArrayList集合,存储三个元素,每一个元素都是HashMap,每一个HashMap的键和值都是String,并遍历。
思路:
1.创建ArrayList集合
2.创建HashMap集合,并添加键值对元素
3.把HashMap作为元素添加到ArrayList集合
4.遍历ArrayList集合

package daily_Map;

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

public class MapSimpleArrayList {
    public static void main(String[] args) {
        ArrayList<HashMap<String,String>> array=new ArrayList<>();
        HashMap<String,String> hm1=new HashMap<>();
        hm1.put("孙策","大乔");
        hm1.put("周瑜","小乔");
        array.add(hm1);
        HashMap<String,String> hm2=new HashMap<>();
        hm2.put("郭靖","黄蓉");
        hm2.put("杨过","小龙女");
        array.add(hm2);
        HashMap<String,String> hm3=new HashMap<>();
        hm3.put("令狐冲","任盈盈");
        hm3.put("林平之","岳灵珊");
        array.add(hm3);

        for(HashMap<String,String> hashM:array){
            Set<String> keySet=hashM.keySet();
            for(String key:keySet){
                String value=hashM.get(key);
                System.out.println(key+","+value);
            }
        }
    }
}

输出结果:

孙策,大乔
周瑜,小乔
杨过,小龙女
郭靖,黄蓉
令狐冲,任盈盈
林平之,岳灵珊

5.9 案例:HashMap集合存储ArrayList元素并遍历

需求:创建一个HashMap集合,存储三个键值对元素,每一个键值对元素的键是String,值是ArrayList,每一个ArrayList的元素是String,并遍历。
思路:
1.创建HashMap集合
2.创建ArrayList对象
3.创建ArrayList对象添加到HashMap集合中
4.遍历HashMap集合

package daily_Map;

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

public class MapSimpleHashMap {
    public static void main(String[] args) {
        Map<String, ArrayList<String>> mapArrayList =new HashMap<>();
        ArrayList<String> arrayList1=new ArrayList<String>();
        arrayList1.add("诸葛亮");
        arrayList1.add("赵云");
        arrayList1.add("吕布");
        mapArrayList.put("三国演义",arrayList1);

        ArrayList<String> arrayList2=new ArrayList<String>();
        arrayList2.add("孙悟空");
        arrayList2.add("猪八戒");
        arrayList2.add("唐僧");
        arrayList2.add("沙和尚");
        arrayList2.add("白骨精");
        mapArrayList.put("西游记",arrayList2);
        System.out.println(mapArrayList);

        ArrayList<String> arrayList3=new ArrayList<String>();
        arrayList3.add("武松");
        arrayList3.add("鲁智深");
        mapArrayList.put("水浒传",arrayList3);

        Set<String> keySet=mapArrayList.keySet();
        for (String key:keySet){
            ArrayList<String> array=mapArrayList.get(key);
            System.out.println("著作名:"+key);
            for(String s:array){
                System.out.println(s);
            }
            System.out.println("----------------");
        }
    }
}

输出结果:

{三国演义=[诸葛亮, 赵云, 吕布], 西游记=[孙悟空, 猪八戒, 唐僧, 沙和尚, 白骨精]}
著作名:水浒传
武松
鲁智深
----------------
著作名:三国演义
诸葛亮
赵云
吕布
----------------
著作名:西游记
孙悟空
猪八戒
唐僧
沙和尚
白骨精
----------------

5.10 案例:统计字符串中每个字符出现的次数

需求:键盘录入一个字符串,要求统计字符串中每个字符出现的次数
举例:”aabcdddd“ 输出:”a(2)b(1)c(1)d(4)“

分析:
键:字符,值:出现的次数,可以用HashMap集合来存储
note:键是字符,类型应该是Character;值是字符出现的次数,类型因该是Integer。
思路:
1.键盘录入一个字符串
2.创建HashMap集合,键是Character,值是Integer
3.遍历字符串得到每一个字符
4.将此字符做为键到HashMap集合中找对应的值,看返回值:
如果返回值为null:说明该字符在HashMap集合中不存在,就把该字符作为键,1为值
如果返回值不为null:说明该字符在HashMap集合中存在,就把值加1,然后存储该字符和对应的值,如果重复会覆盖,值继续加1
5.遍历HashMap集合,得到键和值,按要求进行拼接。

package daily_Map;

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

public class MapCalCharNum {
    public static void main(String[] args) {
        Scanner sc=new Scanner(System.in);
        System.out.println("input a String please!");
        String line=sc.nextLine();//获取输入的字符
        System.out.println(line);

        Map<Character,Integer> hashMap=new HashMap<>();
        for (int i=0;i<line.length();i++){
            char key = line.charAt(i);
            Integer value = hashMap.get(key);

            if(value==null){
                hashMap.put(key,1);
            } else{
                value++;
                hashMap.put(key,value);
            }
        }
        System.out.println(hashMap);
        Set<HashMap.Entry<Character,Integer>> hmSet=hashMap.entrySet();
        StringBuilder sb = new StringBuilder();
        for(HashMap.Entry<Character,Integer> hm:hmSet){
            Character k = hm.getKey();
            Integer v = hm.getValue();
            sb.append(k+"("+v+")");
        }
        String res = sb.toString();
        System.out.println(res);

//        System.out.println("-------------------");
//        StringBuilder sb = new StringBuilder();
//        Set<Character> keySet = hashMap.keySet();
//        System.out.println(keySet);
//        for (Character key:keySet){
//            Integer value = hashMap.get(key);
//            sb.append(key).append("(").append(value).append(")");
//        }
//        String s = sb.toString();
//        System.out.println(s);
    }
}

输出结果:

input a String please!
adccccccced
adccccccced
{a=1, c=7, d=2, e=1}
a(1)c(7)d(2)e(1)

版权声明:程序员胖胖胖虎阿 发表于 2022年11月2日 上午3:16。
转载请注明:Java中的Map | 胖虎的工具箱-编程导航

相关文章

暂无评论

暂无评论...