——- 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的综合运用
Map嵌套运用