天天看點

《黑馬程式員》 map集合練習

public class MapTest {

	/**
	 * 每一個學生都有對應的歸屬地 學生Student,位址:String 
	 * 學生屬性:姓名和年齡 
	 * 注意:姓名和年齡相同的視為同一個學生 保證學生的唯一性
	 * 
	 * 1,描述學生 2,定義map容器,将學生作為鍵,位址做為仁政,存入 3,擷取map集合中的元素
	 */
	public static void main(String[] args) {
		Map<Student,String> map=new HashMap<Student,String>();
		map.put(new Student("scg",25), "吉安");
		map.put(new Student("scg",28), "梅縣");
		map.put(new Student("ldm",21), "吉林長春");
		map.put(new Student("zdf",16), "合肥");
		map.put(new Student("lmp",24), "長化");
		map.put(new Student("zdf",24), "長化");
		map.put(new Student("zdf",16), "長化");
		map.put(new Student("scf",22), "太原");
		
		//第一種取出方式
		//得到所有的key的集合
		Set<Student> keys=map.keySet();
		Iterator<Student> ite=keys.iterator();
		while(ite.hasNext()){
			//傳回疊代到的元素
			Student s=ite.next();
			//得到key所對應的value
			String values=map.get(s);
			System.out.println("第一種取出方式:"+"姓名:"+s.getName()+"..."+"..年齡:"+s.getAge()+"..位址:"+values);
		}
		
		//第二種取出方式
		//取出集合中的元素
		//得到所有key和vlaue映射的集合
		Set<Map.Entry<Student,String>> sets=map.entrySet();
		//擷取疊代器
		Iterator<Map.Entry<Student,String>> itea=sets.iterator();
		while(itea.hasNext()){
			Map.Entry<Student, String> mapInfo=itea.next();
			Student s=mapInfo.getKey();
			String sv=mapInfo.getValue();
			System.out.println("第二種取出方式:學生:姓名:"+s.getName()+"...年齡:"+s.getAge()+"...位址:"+sv);
		}
	}
}

// hash中判斷唯一性是根據的是對象的equals和hashcode方法
class Student { // 保證學生的唯一性
	private String name;
	private int age;

	public Student(String name, int age) {
		this.name = name;
		this.age = age;
	}

	public String getName() {
		return name;
	}

	public int getAge() {
		return age;
	}

	// 先判斷hashcode值再判斷equals
	@Override
	public int hashCode() {
		//我們使用對象的姓名的hashcode+年齡+27/或39都是可以的
		//使用這個來保證對象的唯一性
		return this.name.hashCode()+this.age*37;
	}

	//根據内容來判斷
	//當姓名和年齡都相等的時候它們是同一個人
	@Override
		public boolean equals(Object obj) {
			if(!(obj instanceof Student))
				return false;
			Student s=(Student)obj;
			return s.name.equals(s.name)&&this.age==s.age;
		}
}