HashMap练习

image

练习一:
image

点击查看代码
package com.tiheima.a01mymap;

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

    /**
     * 获取
     * @return name
     */
    public String getName() {
        return name;
    }

    /**
     * 设置
     * @param name
     */
    public void setName(String name) {
        this.name = name;
    }

    /**
     * 获取
     * @return age
     */
    public int getAge() {
        return age;
    }

    /**
     * 设置
     * @param age
     */
    public void setAge(int age) {
        this.age = age;
    }

    public String toString() {
        return "Student{name = " + name + ", 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);
    }
}

点击查看代码
package com.tiheima.a01mymap;

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

public class HashMapDemo1 {
    public static void main(String[] args) {
        /*
            需求:
            创建一个HashMap集合,键是学生对象(Student),值是籍贯(String)。
            存储三个键值对元素,并遍历。
            要求:同姓名,同年龄认为是同一个学生。(创建了同一个学生对象时会覆盖之前的)

            核心点:
            HashMap的键位置如果存储的是自定义对象,需要重写hashCode和equals方法

         */

        //1.创建HashMap集合
        HashMap<Student, String> hm = new HashMap<>();

        //2.创建学生对象
        Student s1 = new Student("zhangsan", 23);
        Student s2 = new Student("lisi", 24);
        Student s3 = new Student("wangwu", 25);
        //创建同一个学生对象
        Student s4 = new Student("wangwu", 25);

        //3.添加元素
        hm.put(s1, "四川");
        hm.put(s2, "江西");
        hm.put(s3, "湖北");

        hm.put(s4, "山东");

        //4.遍历
        //方法一:
        Set<Student> keys = hm.keySet();
        for (Student key : keys) {
            String value = hm.get(key);
            System.out.println(key + " = " + value);
        }
        System.out.println("------------------------------------------------");

        //方法二
        Set<Map.Entry<Student, String>> entries = hm.entrySet();
        for (Map.Entry<Student, String> entry : entries) {
            Student key = entry.getKey();
            String value = entry.getValue();
            System.out.println(key + " = " + value);
        }
        System.out.println("------------------------------------------------");

        //方法三
        hm.forEach((key, value) -> System.out.println(key + " = " + value));
    }
}

练习二:
image

点击查看代码
package com.tiheima.a01mymap;

import java.util.*;

public class HashMapDemo2 {
    public static void main(String[] args) {
        /*
            某个班级80名学生,现在需要组成秋游活动
            班长提供了四个景点依次是(A、B、C、D)
            每个学生只能选择一个景点,请统计出最终哪个景点想去的人数最多。
         */

        //思路:把四个景点作为键,选择对应景点的人数作为值

        //1.定义一个数组,存储4个景点
        String[] arr = {"A", "B", "C", "D"};

        //利用随机数模拟80个学生投票,并把投票结果存储起来
        ArrayList<String> attractionList = new ArrayList<>();
        Random r = new Random();
        for (int i = 0; i < 80; i++) {
            int index = r.nextInt(arr.length);
            attractionList.add(arr[index]);
        }
        
        //2.如果要统计的东西比较多,不方便使用计数器思想
        //可以定义map集合,利用集合进行统计

        HashMap<String, Integer> hm = new HashMap<>();

        //看投票的景点是否已经存在,如果存在,则次数+1
        //如果投票的景点不存在,则次数=1
        for (String attraction : attractionList) {
            if (hm.containsKey(attraction)) {
                //景点存在,对应次数需要+1(即投该景点的人+1)
                //获取当前景点被投票的次数
                int count = hm.get(attraction);
                //被投票次数+1
                count++;
                hm.put(attraction, count);
            }else {
                //当前景点第一次被投票
                hm.put(attraction, 1);
            }
        }

        System.out.println(hm);

        //3.选出最大值
        //景点被投票次数至少为0
        int max = 0;
        Set<Map.Entry<String, Integer>> entries = hm.entrySet();
        for (Map.Entry<String, Integer> entry : entries) {
            //获取每个景点被投票总票数
            int count = entry.getValue();
            if (count > max) {
                max = count;
            }
        }
        //System.out.println(max);

        //打印出票数最多的景点(票数最多的景点可能不止一个)
        for (Map.Entry<String, Integer> entry : entries) {
            if (entry.getValue() == max) {
                System.out.println(entry.getKey() + " = " + entry.getValue());
            }
        }

    }
}

posted @ 2025-09-03 17:13  lachii  阅读(3)  评论(0)    收藏  举报