zoukankan      html  css  js  c++  java
  • java-HashMap默认机制

    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 <String,Integer> map=new HashMap<String,Integer>();
    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<String> set=map.keySet();
    37         Iterator<String> 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<Student> list;//list存放学生信息
     9     private double sum;//总分
    10 
    11     public ClassRoom() {
    12         list=new ArrayList<Student>();
    13     }
    14     public ClassRoom(String className) {
    15         this();
    16         this.className=className;
    17     }
    18     public ClassRoom(String className, List<Student> 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<Student> getList() {
    31         return list;
    32     }
    33     public void setList(List<Student> 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<Student> list=Examing();
    15         //根据传过来的学生考试信息求每个班级的总分
    16         Map<String,ClassRoom> map=getSum(list);
    17         //将班级信息,总分,平均分,班级名称打印出来
    18         getInfo(map);
    19     }
    20 
    21     //获取班级的信息,包括班级名称,总分,平均分
    22     public static void getInfo(Map<String,ClassRoom> map) {
    23         Set<String> key=map.keySet();
    24         //构造迭代器
    25         Iterator<String> 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<String,ClassRoom> getSum(List<Student> list){
    40         //定义一个map集合用于存放班级名(String)
    41         Map<String,ClassRoom> map=new HashMap<String,ClassRoom>();
    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<Student> Examing(){
    62         List<Student>list=new ArrayList<Student>();
    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 }

    效果截图:

    好了,这样就将之前学过的泛型以及简单的分拣方法用上去了,同时也实现了面向对象编程,不过还是需要进行深入,因为真正的分拣存储(对于我这个小白)还是比较晦涩难懂的。

  • 相关阅读:
    Spring
    Spring
    Spring
    Spring
    JS 脱敏通用方法
    JS 实用技巧记录
    多快?好省!
    实战 | 如何使用微搭低代码实现按条件过滤数据
    2021腾讯数字生态大会落地武汉,微搭低代码专场等你来
    实战 | 如何使用微信云托管部署flask项目
  • 原文地址:https://www.cnblogs.com/weekstart/p/10775040.html
Copyright © 2011-2022 走看看