HashMap练习

练习一:

点击查看代码
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));
    }
}
练习二:

点击查看代码
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());
            }
        }
    }
}
                    
                
                
            
        
浙公网安备 33010602011771号