作者:Eliza | 来源:互联网 | 2023-10-10 14:29
HashMap:键值对(key-value):通过对象来对对象进行索引,用来索引的对象叫做key,其对应的对象叫做value.默认是1:1关系:存在则覆盖,当key已经存在,则利用新的va
HashMap:键值对(key-value):
通过对象来对对象进行索引,用来索引的对象叫做key,其对应的对象叫做value.
默认是1:1关系:
存在则覆盖,当key已经存在,则利用新的value覆盖原有的value;
示例:
1 package com.etc;
2
3 import java.util.HashMap;
4 import java.util.Map;
5
6 public class Test {
7
8 public static void main(String[] args) {
9 Map map=new HashMap();
10 map.put(1, "java");
11 map.put(2, "python");
12 map.put(1, "c++");
13 System.out.println(map.get(1)+" "+map.get(2));
14
15 }
16 }
运行效果截图:
很明显可以看出来,key1对应的value值被后面put进去的value值覆盖了,那么问题来了,如果我想要一个key去存放多个value值,以便观察其value值的变化趋势该怎么办呢?
分拣存储(分组归类):
what? : 以快递公司分拣包裹为例,首先包裹可以来自不同的地方(北京上海深圳广东...)然而快递选择的方式似乎就那么几种,什么顺丰,京东,韵达,邮政等,我们需要确定包裹选择怎样的快递,然后把它们分开,对每一种快递方式对应的包裹进行不一样的操作,这就是分拣的一种场景,然后我要存放这些相同快递的包裹,就得有个容器,这就开始奔向了java的HashMap的特殊机制了。
示例1(未涉及真正的分拣存储):
1 package com.etc;
2
3 import java.util.HashMap;
4 import java.util.Iterator;
5 import java.util.Map;
6 import java.util.Set;
7
8 /*
9 统计单词出现的次数
10 思路:
11 1.分割字符串
12 2.分拣存储 1:N
13 3.按要求查看单词出现的次数
14 */
15 public class MapDemo1 {
16 public static void main(String[] args) {
17 String str="i just want to study hard and i feel so happy";
18 //根据空格分割字符串
19 String[] arr=str.split(" ");
20 //利用泛型存放 单词-次数
21 Map map=new HashMap();
22 for(String key :arr) {
23 //将每个单词打印出来
24 System.out.print(key+"--");
25 //若单词不存在相同的
26 if(!map.containsKey(key)) {
27 //将value值也就是次数设为1
28 map.put(key, 1);
29 //若存在相同的,则每出现一次将value值+1
30 }else {
31 map.put(key, map.get(key)+1);
32 }
33 }
34 System.out.println();
35 //查看每个单词的次数
36 Set set=map.keySet();
37 Iterator it=set.iterator();
38 while(it.hasNext()) {
39 String key=it.next();
40 Integer value=map.get(key);
41 //打印出单词及其出现的次数
42 System.out.println(key+"-->"+value);
43 }
44 }
45 }
效果截图:
示例2:(面向对象实现分拣存储)
我们模拟一个场景,有多个班级的学生同时进行考试后将个人信息录入,我们需要得到每个班的总分和平均分并将其记录下来。
代码实现:
1.新建两个实体类,用于创建对象记录信息
(1)Student.java
1 package com.etc;
2
3 public class Student {
4 //学生的姓名,编号,所属班级名,分数
5 private String name;
6 private int id;
7 private String className;
8 private double score;
9
10 public Student() {
11
12 }
13 public Student(String name, int id, String className, double score) {
14 super();
15 this.name = name;
16 this.id = id;
17 this.className = className;
18 this.score = score;
19 }
20 public String getName() {
21 return name;
22 }
23 public void setName(String name) {
24 this.name = name;
25 }
26 public int getId() {
27 return id;
28 }
29 public void setId(int id) {
30 this.id = id;
31 }
32 public String getClassName() {
33 return className;
34 }
35 public void setClassName(String className) {
36 this.className = className;
37 }
38 public double getScore() {
39 return score;
40 }
41 public void setScore(double score) {
42 this.score = score;
43 }
44
45 }
(2)ClassRoom.java
1 package com.etc;
2
3 import java.util.ArrayList;
4 import java.util.List;
5
6 public class ClassRoom {
7 private String className;//班级名称
8 private List list;//list存放学生信息
9 private double sum;//总分
10
11 public ClassRoom() {
12 list=new ArrayList();
13 }
14 public ClassRoom(String className) {
15 this();
16 this.className=className;
17 }
18 public ClassRoom(String className, List list, double sum) {
19 super();
20 this.className = className;
21 this.list = list;
22 this.sum = sum;
23 }
24 public String getClassName() {
25 return className;
26 }
27 public void setClassName(String className) {
28 this.className = className;
29 }
30 public List getList() {
31 return list;
32 }
33 public void setList(List list) {
34 this.list = list;
35 }
36 public double getSum() {
37 return sum;
38 }
39 public void setSum(double sum) {
40 this.sum = sum;
41 }
42
43 }
2.测试类,进行场景模拟及方法实现
1 package com.etc;
2
3 import java.util.ArrayList;
4 import java.util.HashMap;
5 import java.util.Iterator;
6 import java.util.List;
7 import java.util.Map;
8 import java.util.Set;
9
10 public class MapDemo2 {
11
12 public static void main(String[] args) {
13 //考试信息录入
14 List list=Examing();
15 //根据传过来的学生考试信息求每个班级的总分
16 Map map=getSum(list);
17 //将班级信息,总分,平均分,班级名称打印出来
18 getInfo(map);
19 }
20
21 //获取班级的信息,包括班级名称,总分,平均分
22 public static void getInfo(Map map) {
23 Set key=map.keySet();
24 //构造迭代器
25 Iterator it=key.iterator();
26 //获取记录
27 while(it.hasNext()) {
28 String cno=it.next();
29 ClassRoom cr=map.get(cno);
30 //查看总分,计算平均分
31 double total=cr.getSum();
32 //计算平均分:总分/该班级下的学生数
33 double avg=total/cr.getList().size();
34 System.out.println(" 班级名称:"+cno+" 总分:"+total+" 平均分:"+avg);
35 }
36 }
37
38 //统计信息,每个班的平均成绩
39 public static Map getSum(List list){
40 //定义一个map集合用于存放班级名(String)
41 Map map=new HashMap();
42 //遍历list
43 for(Student stu :list) {
44 String cno=stu.getClassName();//班级编号
45 double sco=stu.getScore();//学生成绩
46 //查看是否有该班级
47 ClassRoom cr=map.get(cno);
48 if(cr==null) {
49 //不存在则创建班级
50 cr=new ClassRoom(cno);
51 map.put(cno, cr);
52 }
53 //存在则放入学生
54 cr.getList().add(stu);//放入学生
55 cr.setSum(cr.getSum()+sco);//计算该班级的总分
56 }
57 return map;
58 }
59
60 //场景模拟,学生考试成绩信息录入
61 public static List Examing(){
62 Listlist=new ArrayList();
63 list.add(new Student("张三",1,"软件一班",85));
64 list.add(new Student("李四",2,"软件一班",87));
65 list.add(new Student("王五",3,"软件二班",86));
66 list.add(new Student("朱六",4,"软件二班",85));
67 list.add(new Student("关羽",4,"软件二班",88));
68 return list;
69 }
70
71 }
效果截图:
好了,这样就将之前学过的泛型以及简单的分拣方法用上去了,同时也实现了面向对象编程,不过还是需要进行深入,因为真正的分拣存储(对于我这个小白)还是比较晦涩难懂的。
ps:文章待完善,之后会进行相应的更改。