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号