----------------------
android培训、
java培训、期待与您交流! ----------------------
-------------------- ASP.Net+Android+IOS开发、 .Net培训、期待与您交流! ----------------------
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培训、期待与您交流! ----------------------