需求:
(1)一對多關係的創建。
一個學校有多個教室,一個教室有多個學生。
假設一個學校有倆教室,每個教室有倆學生。
學校:xuexiao
教室:jiaoshi01、jiaoshi02
學生(甲乙丙丁+學號):
jiaoshi01: jia A01、 yi A15
jiaoshi02: bing B01、 ding B05
分析:
無論如何,我們先將其存入Map容器。看下面代碼:
主函數:
public static void main(String[] args)
{
//先創建倆教室:
//教室和學生也是map關係,所以:
//教室.put(學生標識,學生名字)
HashMap<String,String> jiaoshi01 = new HashMap<String,String>();
HashMap<String,String> jiaoshi02 = new HashMap<String,String>();
//存入學生:
jiaoshi01.put("jia","A01");
jiaoshi01.put("yi","A15");
jiaoshi02.put("bing","B01");
jiaoshi02.put("ding","B05");
//再來看學校和教室的關係寫法:
//map裏包含鍵和值。所以呢:
//學校.put(教室標識(String),教室名(hashMap類型的))
HashMap<String,HashMap<String,String>> xuexiao = new HashMap<String,HashMap<String,String>>();
xuexiao.put("jiaoshi01",jiaoshi01);
xuexiao.put("jiaoshi02",jiaoshi02);
//調用
System.out.println("學校.put(班級),班級.put(學生)");
//打印下看下結果:
System.out.println("getStudentInfoOne(xuexiao)的打印結果:");
getStudentInfoOne(xuexiao);
System.out.println("=========================================");
System.out.println("getStudentInfoOne(xuexiao,jiaoshi01)、getStudentInfoOne(xuexiao,jiaoshi02)的打印結果:");
getStudentInfoOne(xuexiao,"jiaoshi01");
getStudentInfoOne(xuexiao,"jiaoshi02");
}
至此,我們便實現了一對多關係的創建。但是這不是重點,重點是:
在建立玩映射關係之後,我們應用的時候往往需要查詢操作。
所以關鍵是查詢。Map的查詢不外乎迭代器。只要邏輯能夠理清楚,就沒有太大問題。
需求一:取出教室01裏的所有學生的信息
//定義一個打印學生的方法(給出學校和教室):
public static void getStudentInfoOne(HashMap<String,HashMap<String,String>> xuexiao,String jiaoshi)
{
//得到教室實體:
HashMap<String,String> jsname = xuexiao.get(jiaoshi);
//已知教室是一個HashMap<Sno,Sname>。利用迭代器實現遍歷並取出學生的信息。
Set<String> hs = jsname.keySet();
Iterator<String> it = hs.iterator();
while(it.hasNext())
{
String Sname = it.next();
String Sno = jsname.get(Sname);
System.out.println(Sno+"="+Sname);
}
}
需求二:取出學校的所有學生的信息
//定義一個打印學生的方法(給出學校):
public static void getStudentInfoOne(HashMap<String,HashMap<String,String>> xuexiao)
{
//得到所有的key
Set<String> x$jsbiaoshi = xuexiao.keySet();
//遍歷
Iterator<String> it$xjs = x$jsbiaoshi.iterator();
//循環
while(it$xjs.hasNext())
{
//返回結果是一個教室的map集合
String xjsbiaoshi = it$xjs.next();
//從標識String,利用get得到hashMap(value)
HashMap<String,String> jiaoshiMap = xuexiao.get(xjsbiaoshi);
//對教室map集合進行keySet取其key,即取出其Sname作爲一個set集合
Set<String> stuname = jiaoshiMap.keySet();
//對Sname這個Set集合進行遍歷取其Sno
Iterator<String> it$stu = stuname.iterator();
//循環
while(it$stu.hasNext())
{
//往下遍歷學生name
String sname = it$stu.next();
//利用map集合的get方法取其Sno;
String sno = jiaoshiMap.get(sname);
//打印
System.out.println(sno+"="+sname);
}
}
}
方法二其實可以調用方法一的方法,放在內層的while循環裏。
運行結果:
開發分析
實際開發並不會把學生信息進行分開寫。而是作爲一個對象進行處理。所以:
class Student
{
private String sname;
private String sno;
public Student(String sname,String sno)
{
this.sname=sname;
this.sno=sno;
}
public String getSname()
{
return sname;
}
public String getSno()
{
return sno;
}
public String toString()
{
return sname+":"+sno;
}
}
需求:打印全體學生
public static void getStudentInfoTwo(HashMap<String,List<Student>> xuexiao)
{
//得到所有的key
Set<String> x$jsbiaoshi = xuexiao.keySet();
//遍歷
Iterator<String> it$xjs = x$jsbiaoshi.iterator();
//循環
while(it$xjs.hasNext())
{
//返回結果是一個教室的map集合
String xjsbiaoshi = it$xjs.next();
//從標識String,利用get得到hashMap(value)
List<Student> jiaoshilist = xuexiao.get(xjsbiaoshi);
//對jiaoshilist集合進行遍歷取其Sno
Iterator<Student> it$stu = jiaoshilist.iterator();
//循環
while(it$stu.hasNext())
{
//往下遍歷學生name
Student stu = it$stu.next();
//打印
System.out.println(stu.getSno()+"="+stu.getSname());
}
}
}
主函數:
public static void main(String[] args)
{
//實際開發並不會把學生信息進行分開寫。而是作爲一個對象進行處理。所以:
//學校會這樣寫:
HashMap<String,List<Student>> xuexiaoA = new HashMap<String,List<Student>>();
//教室會這樣寫:
List<Student> jiaoshiA = new ArrayList<Student>();
List<Student> jiaoshiB = new ArrayList<Student>();
//添加不變
xuexiaoA.put("jiaoshiA",jiaoshiA);
xuexiaoA.put("jiaoshiB",jiaoshiB);
jiaoshiA.add(new Student("jia","A01"));
jiaoshiA.add(new Student("yi","A15"));
jiaoshiB.add(new Student("bing","B01"));
jiaoshiB.add(new Student("ding","B05"));
//調用方法
getStudentInfoTwo(xuexiaoA);
}