黑马程序员 三种f方式用Map集合存放Student类,存放顺序各不同

---------------------- android培训java培训、期待与您交流! ----------------------
import java.util.*;
/*
 * 学生类有姓名年龄,地址直接写String
 * 可以存二叉树结构的Map,也可以存哈希结构的Map
 * 学生为键,地址为值,存入map,获取map中的元素
 * 
 * 第一种:HashMap
 * 第二种:TreeMap,Student自定义了先按年龄排序
 * 第三种:带有比较器的TreeMap,先按名字排序
 * */
class MapStudentDemo
{
	public static void main(String[] a)
	{
		//哈希结构
		HashMap<Student,String> p=new HashMap<Student,String>();
		p.put(new Student("李倩影",21), "常德");
		p.put(new Student("晶哥哥",23), "广西");
		p.put(new Student("西西个",22), "浙江");
		p.put(new Student("王尼玛",24), "江苏");
		showValueFromKeySet(p);//第一种方式,取出key装进set集合,迭代每个key,取出相应的value
		showMapEntry(p);//第二种方式,取出映射关系Set<Map.Entry<Student,String>>
		
		//现在用二叉树,Student默认先按年龄排序
		TreeMap<Student,String> q=new TreeMap<Student,String>();
		q.put(new Student("hj李倩影2",21), "常德2");
		q.put(new Student("c晶哥哥2",23), "广西2");
		q.put(new Student("a西西个2",23), "浙江2");
		q.put(new Student("a王尼玛2",24), "江苏2");
		showValueFromKeySet(q);//第一种方式,取出key装进set集合,迭代每个key,取出相应的value
		showMapEntry(q);//第二种方式,取出映射关系Set<Map.Entry<Student,String>>
		
		//还是二叉树,学生自定义先按年龄排序,但这次要让他先按名字排,就写比较器
		TreeMap<Student,String> r=new TreeMap<Student,String>(new comp3());
		r.put(new Student("mike",21), "常德3");
		r.put(new Student("hike",23), "广西3");
		r.put(new Student("hike",22), "浙江3");
		r.put(new Student("a王尼玛3",24), "江苏3");
		showValueFromKeySet(r);//第一种方式,取出key装进set集合,迭代每个key,取出相应的value
		showMapEntry(r);//第二种方式,取出映射关系Set<Map.Entry<Student,String>>
	}
	//第一种打印方式封装
	public static <K,V> void showValueFromKeySet(Map<K,V>  map)
	{
		Set<K> keys= map.keySet();
		Iterator<K> it=keys.iterator();
		while(it.hasNext())
		{
			K key=it.next();
			V value= map.get(key);
			sop(key+"来自于:"+value);
		}
		sop(' ');//打个空行
	}
	//第二种打印方式封装
	public static <K,V> void showMapEntry(Map<K,V> me)
	{
		Set<Map.Entry<K,V>> mes=me.entrySet();
		Iterator<Map.Entry<K,V>> it=mes.iterator();
		while(it.hasNext())
		{
			Map.Entry<K,V> rela=it.next();
			K key=rela.getKey();
			V value= rela.getValue();
			sop(key+"的家乡是:"+value);
		}
		sop(' ');//打个空行
	}
	public static void sop(Object b)//单纯的打印内容,封装起来方便使用
	{
		System.out.println(b);
	}
}
class Student implements Comparable<Student>//实现Comparable接口,因为二叉树结构需要对象具备比较性
{
	private Integer age;
	private String name;
	Student(String name,Integer age)//构造函数初始化属性
	{
		this.name=name;
		this.age=age;
	}
	public String getName()
	{
		return name;
	}
	public Integer getAge()
	{
		return age;
	}
	public String toString()//为了打印本类对象时输出我们要的内容,姓名和年龄
	{
		return name+":"+age+"岁,";
	}
	public int compareTo(Student s)//复写学生类的比较方法,默认先按年龄比,再按名字比
	{
		int num=age.compareTo(s.age);
		if (num==0)
			return name.compareTo(s.name);
		return num;
	}
	public int hashCode()//哈希结构要判断哈希值
	{
		return name.hashCode()+age*13;//自定义哈希值,*13是为了让每个不同内容的学生对象的哈希值尽可能不同
	}
	public boolean equals(Object obj)//哈希值相同时自动调用equals,我们要自定义equals比什么
	{
		if(!(obj instanceof Student))
			throw new ClassCastException("类型不匹配");//非Student进来就抛异常
		Student b=(Student)obj;//强转类型
		return name.equals(b.name)&&age.equals(b.age);
	}
}
class comp3 implements Comparator<Student>//实现Student类的比较器,一旦用了比较器就不管学生类自定义的compareTo方法了
{
	public int compare(Student s1,Student s2)//复写compare方法,我们让他先按名字排再按年龄排
	{
		int num=s1.getName().compareTo(s2.getName());
		if (num==0)//先比较名字,名字相同就比年龄,按年龄顺序排
			return s1.getAge().compareTo(s2.getAge());
		return num;//名字不同就按名字的自然顺序排
	}
}

-------------------- ASP.Net+Android+IOS开发.Net培训、期待与您交流! ----------------------
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值