Map扩展

作者: 东风谷123Liter | 来源:发表于2018-09-19 22:03 被阅读0次
  • 多个映射关系;
  • 一对多映射;HashMap内部是不允许一对多映射,但我们可以认为一个集合对应集合内的所有元素是一个一对多的映射关系;如,物联网专业有两个班,每个班都有32个学生;我们就可以分别定义两个HashMap集合来代表两个班,每个班里面学生的学号作为键,学生名称作为值;我们还可以定义一个HashMap集合来装这两个班,我们叫他“物联网工程专业”。
  • 例子:
/*
 * 需求:现在要用所学过的知识,将物联网专业、物联网1班、物联网2班、每个班的学生之间的关系
 * 对应起来,并存入集合;同时也要遍历所有学生。
 * 思路:
 * 可以定义两个HashMap集合来作为班级;同学们的学号和姓名形成一对映射关系;学号为键。
 * 遍历这俩个集合就能获取每个班上每个同学的信息
 * 如果要一次性遍历两个班的所有学生,我们可以定义一个HashMap集合来表示物联网专业,
 * 通过遍历整个专业来遍历所有学生。班级名称作为主键。
 *
*/
import java.util.*;
public class WuLianWang_HashMap {
     public static void main(String[] args) {
           HashMap<String, String> class1 = new HashMap<String,String>();
           HashMap<String, String> class2 = new HashMap<String,String>();
           class1.put("01","zhangsan");
           class1.put("02","lisi");
           class1.put("03","wanwu");
           class2.put("01","zhangsan");
           class2.put("02","lisi");
           class2.put("03","wanwu");
           //打印:
           getInfo(class1);
           System.out.println();
           getInfo(class2);
     }
     //定义一个获取学生信息的方法:
     public static void getInfo(HashMap<String,String> hm) {
           Set<Map.Entry<String, String>> set = hm.entrySet();
           Iterator<Map.Entry<String, String>> it = set.iterator();
           while(it.hasNext()) {
                Map.Entry<String,String> me = it.next();
                String id = me.getKey();
                String name = me.getValue();
                System.out.println(id+"..."+name);
           }
  • 结果:


  • 通过便利整个专业打印所有学生信息:
HashMap<String,HashMap<String,String>> wulianwang = new HashMap<String,HashMap<String,String>>();
           wulianwang.put("class01", class1);
           wulianwang.put("class02", class2);
           Iterator<String> it = wulianwang.keySet().iterator();
           while(it.hasNext()) {
                String banji = it.next();
                HashMap<String,String> room = wulianwang.get(banji);//通过班级名字返回班级HashMap集合。
                System.out.println(banji);
//调用班级遍历方法; 
                getInfo(room);
           }
     }    
}
  • 结果:


  • 改进:实际开发中不会用那么多HashMap集合2这些映射关系,就像学生我们可以把它封装成一个学生对象,这样就可以不用HashMap集合来存储学生姓名与学号的映射关系。
class Student03{
     private String id;
     private String name;
     Student03(String i, String n){
           this.id = i;
           this.name = n;
     }
     public String getId() {
           return id;
     }
     public String getName() {
           return name;
     }
     public String toString() {
           return id+"..."+name;
     }
}
class WuLianWang_HashMap{
     public static void main(String[] args) {
           //用li1存储class1的学生信息;
           List<Student03> li1 = new ArrayList<Student03>();
           li1.add(new Student03("01","zhangsan"));
           li1.add(new Student03("02","lisi"));
           li1.add(new Student03("03","wangwu"));
           //用li2存储class2的学生信息;
           List<Student03> li2 = new ArrayList<Student03>()
           li2.add(new Student03("01","zhangsan"));
           li2.add(new Student03("02","lisi"));
           li2.add(new Student03("03","wangwu"));
           //定义一个hashMap集合hm来存储班级与学生之间的映射关系
           HashMap<String, List<Student03>> hm = new HashMap<String, List<Student03>>();
           hm.put("class1", li1);
           hm.put("class2", li2);
           //使用获取映射关系的方法遍历hm,并打印班级名称及学生信息。
           Set<Map.Entry<String, List<Student03>>> set = hm.entrySet();
           Iterator<Map.Entry<String, List<Student03>>> it = set.iterator();
           while(it.hasNext()) {
                Map.Entry<String, List<Student03>> me = it.next();
                String className = me.getKey();
                List<Student03> lis = me.getValue();
                System.out.println(className+"---"+lis);   
           }
     }
}
  • 结果:

相关文章

网友评论

      本文标题:Map扩展

      本文链接:https://www.haomeiwen.com/subject/wquwnftx.html