天天看点

黑马程序员_日记61_map扩展知识map扩展知识。

 ——- android培训、java培训、期待与您交流! ———-

map扩展知识。

示例:

学校czbz有多个教室:yurenban,jiuyeban

每个教室有多个学生;

学生有编号和姓名。

“yureban” “01” “zhangsan”;

“yureban” “02” “lisi”;

“jiuyeban” “01” “wangwu”;

“jiuyeban” “02” “zhaoliu”;

一个学校有多个教室。每一个教室都有名称。

分析

map集合被使用是因为具备映射关系。

map集合的特点是一个键对应一个值,不能有重复的键。

但是如果我们想要实现一对多的功能,该怎么做呢?

一 下面首先演示利用一个map集合的嵌套使用来“变相”实现:map集合一对多。

思路:

//1 创建学校的映射

    //2 创建预热班教室的映射

    //3 创建就业班教室的映射

    //4 在学校中添加映射项

    //5 在预热班中添加映射项

    //6 在就业班中添加映射项

    //7 取出并打印学校所有的映射项

    //8 取出并打印教室所有的映射项
           

二 按照集合面向对象的思路来设计

1 把Id和name存入学生对象—抽象出学生类

2 把学生对象存入学生班级

3 创建学校映射,让班级名称映射班级

实现步骤:

1 设计学生类

2 创建学校映射

3 建立班级名称和班级的映射关系

4 把学生对象添加到学生班级

5 迭代取出学生班级和学生

注意:

ArrayList:底层的数据结构使用的是数组结构。

所以既不可以用Comparable排序也不可以用Comparator排序。

要排序的话,就得利用数组的排序方法。

import java.util.*;
public class MapAdvancedDemo
{
    //sop打印
    public static void sop(Object obj)
    {
        System.out.println(obj);
    }

    //主函数
    public static void main(String[] args)
    {
        //一 map嵌套实现一对多
        //mapAdvancedDemo();

        //二 map和List综合实现
        mapListDemo();
    }

    //一 只使用map嵌套来实现
    public static void mapAdvancedDemo()
    {
        //1 创建学校的映射
        TreeMap<String,TreeMap<String,String>> school = new TreeMap<String,TreeMap<String,String>>();

        //2 创建预热班教室的映射
        TreeMap<String,String> preClass = new TreeMap<String,String>(); 

        //3 创建就业班教室的映射
        TreeMap<String,String> jobClass = new TreeMap<String,String>();

        //4 在学校中添加映射项
        school.put("preClass",preClass);
        school.put("jobClass",jobClass);

        //5 在预热班中添加映射项
        preClass.put("pc001","Jack");
        preClass.put("pc004","Bob");
        preClass.put("pc002","Alice");
        preClass.put("pc003","Mike");

        //6 在就业班中添加映射项
        jobClass.put("jc001","Tom");
        jobClass.put("jc003","Selina");
        jobClass.put("jc004","David");
        jobClass.put("jc002","Jimmy");

        //7 取出并打印学校所有的映射项
        //7.1 先取出所有键存入Set,再利用迭代取出键,并获取值
        for(Iterator<String> it= school.keySet().iterator(); it.hasNext(); )
        {
            //* 迭代获取教室名称
            String className = it.next();
            //** 获取教室 
            TreeMap<String,String> classroom = school.get(className);
            //*** 打印教室名称
            sop(className);

        //8 取出并打印教室所有的映射项
            //8.1 先取出所有映射项存入Map.Entry,再迭代取出映射项,获取键和值
            for(Iterator<Map.Entry<String,String>> iter = classroom.entrySet().iterator(); iter.hasNext(); )
            {
                //*    迭代取出教室映射项
                Map.Entry<String,String> me = iter.next();
                //**   获取学生编号
                String id = me.getKey();
                //***  获取学生姓名
                String name = me.getValue();

                //**** 打印学生编号和学生姓名
                sop(id+"....."+name);
            }
        }
    }

    //二 按照集合面向对象的思路来设计
    public static void mapListDemo()
    {
        //1 创建学校映射
        TreeMap<String,List<Student>> school = new TreeMap<String,List<Student>>();

        //2 创建预热班
        List<Student> preClass = new ArrayList<Student>();
        //3 创建就业班
        List<Student> jobClass = new ArrayList<Student>();

        //4 建立学生班级名称和学生班级的映射关系
        school.put("预热班",preClass);
        school.put("就业班",jobClass);

        //5 预热班添加学生
        preClass.add(new Student("pc001","Jack"));
        preClass.add(new Student("pc004","Bob"));
        preClass.add(new Student("pc002","Jakie"));
        preClass.add(new Student("pc003","Mike"));

        //6 就业班添加学生
        jobClass.add(new Student("jc001","Alice"));
        jobClass.add(new Student("jc002","Lily"));
        jobClass.add(new Student("jc003","Tom"));
        jobClass.add(new Student("jc004","David"));

        //迭代取出并打印学校班级和学生信息
        getInfor(school);

    }

    //第二种思路最后一步:迭代取出并打印学校班级和学生信息
    public static void getInfor(TreeMap<String,List<Student>> school)
    {
        //7 迭代取出并打印班级名称
        for(Iterator<String> it = school.keySet().iterator(); it.hasNext(); )
        {
            //获取班级名称
            String className = it.next();
            //获取班级
            List<Student> classroom = school.get(className);
            //打印班级名称
            sop(className);

        //8 迭代取出并打印学生
            for(Iterator<Student> iter = classroom.iterator(); iter.hasNext(); )
            {
                //获取学生
                Student stu = iter.next();
                //打印学生
                sop(stu.toString());
            }
        }       
    }
}


//学生类
class Student 
{
    private String id;//学生编号
    private String name;//学生姓名
    Student(String id ,String name)//构造函数初始化
    {
        this.id = id;
        this.name = name;
    }

    public void setId(String id)
    {
        this.id = id;
    }

    public String getId()
    {
        return id;
    }

    public void setName(String name)
    {
        this.name = name;
    }

    public String getName()
    {
        return name;
    }

    //覆盖hashCode
    public int hashCode()
    {
        return id.hashCode()+name.hashCode()*;
    }

    //覆盖equals方法
    public boolean equals(Object obj)
    {
        if(!(obj instanceof Student))
            throw new ClassCastException("不能转换为Student");
        //强制转换
        Student stu = (Student)obj;
        //Id相同则判定为同一个人
        return this.getId().equals(stu.getId());
    }

    public String toString()//覆盖toString
    {
        return id+"..."+name;
    }
}
           
map和List的综合运用
黑马程序员_日记61_map扩展知识map扩展知识。
Map嵌套运用
黑马程序员_日记61_map扩展知识map扩展知识。