利用map集合實現一對多關係的映射

需求:
(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);

	}
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章