A股上市公司传智教育(股票代码 003032)旗下技术交流社区北京昌平校区

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© 杜成龙 中级黑马   /  2013-9-27 22:59  /  1453 人查看  /  4 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

本帖最后由 杜成龙 于 2013-9-28 14:26 编辑
  1. import java.util.*;

  2. class Student implements Comparable<Student>
  3. {
  4. String name;
  5. int age;
  6. Student(String name,int age)
  7. {
  8. this.name=name;
  9. this.age=age;
  10. }
  11. public String getName()
  12. {
  13. return name;
  14. }
  15. public int getAge()
  16. {
  17. return age;
  18. }

  19. public int compareTo(Student s)
  20. {
  21. int num=new Integer(this.age).compareTo(new Integer(s.age));
  22. if(num==0)
  23. return this.name.compareTo(s.name);
  24. return num;
  25. }
  26. public String toString()
  27. {
  28. return this.name+":"+this.age;
  29. }
  30. }

  31. class MapTest2
  32. {
  33. public static void main(String[] args)
  34. {
  35. TreeMap<Student,String> tm=new TreeMap<Student,String>();
  36. tm.put(new Student("lisi03",23),"nanjing");
  37. tm.put(new Student("lisi04",24),"wuhan");
  38. tm.put(new Student("lisi01",21),"beijing");
  39. tm.put(new Student("lisi01",21),"tianjin");
  40. tm.put(new Student("lisi02",22),"shanghai");
  41. Set<Student> keyset=tm.keySet();
  42. Iterator<Student> it=keyset.iterator();
  43. while(it.hasNext())
  44. {
  45. Student s1=it.next();
  46. String addr=tm.get(s1);
  47. sop(s1+":"+addr);
  48. }
  49. }
  50. public static void sop(Object obj)
  51. {
  52. System.out.println(obj);
  53. }
  54. }
复制代码
请大家帮忙看下,上面这段代码,要求把学生按年龄进行排序,并且认为同名同年龄的学生是同一个学生,这里又没有定义equals方法,它是怎么保证不能存入相同学生的呢?

评分

参与人数 1技术分 +1 收起 理由
黄兴旺 + 1

查看全部评分

4 个回复

倒序浏览
通过比较器来进行判别:
public int compareTo(Student s)
{
int num=new Integer(this.age).compareTo(new Integer(s.age));
if(num==0)
return this.name.compareTo(s.name);
return num;
}

评分

参与人数 1技术分 +1 收起 理由
黄兴旺 + 1

查看全部评分

回复 使用道具 举报
TreeMap和TreeSet一样,都是通过持有对象的实现的比较方法来判断唯一性的
回复 使用道具 举报
Set集合中:重写:hashCode和equals方法是为了保证存入的对象不一样,
然后实现接口Comparable,是为了是对象具有可比性,可以在TreeSet集合中可以对存入的集合进行比较

当你没有实现hashCode和equals方法,那么不能保证集合对象的唯一性,但是如果你自定义了比较器(Comparator接口),
那么集合会根据你的比较器对存入的集合进行排序,如果相等那么则会排序存入一个。
  1. public class StuNameComparator implements Comparator<Student> {
  2. /*按照姓名排序,如果姓名相同,那么按照年龄排序*/
  3.         public int compare(Student o1, Student o2) {
  4.                 int num = o1.getName().compareTo(o2.getName());
  5.                 if (num == 0) {
  6.                         return o1.getAge() - o2.getAge();
  7.                 }
  8.                 return num;
  9.         }

  10. }


  11. public class Student /*implements Comparable<Student> */{// 十七具有比较性,防止排序的出现异常
  12.         private String name;// 姓名
  13.         private int age;// 年龄

  14.         public Student(String name, int age) {
  15.                 super();
  16.                 this.name = name;
  17.                 this.age = age;
  18.         }

  19.         public String getName() {
  20.                 return name;
  21.         }

  22.         public int getAge() {
  23.                 return age;
  24.         }

  25. //        /* 重写hashCode()方法 */
  26. //        public int hashCode() {
  27. //                return this.name.hashCode() + this.age * 12;
  28. //        }
  29. //
  30. //        /* 重写equals方法 */
  31. //        public boolean equals(Object ob) {
  32. //                if (!(ob instanceof Student))
  33. //                        throw new ClassCastException("不是Student对象");
  34. //                Student stu = (Student) ob;
  35. //                return this.name.equals(stu.getName()) && this.age == stu.getAge();
  36. //
  37. //        }
  38. //
  39. //        /*
  40. //         * 覆写CompareTo方法 先比较年龄,然后比较姓名
  41. //         */
  42. //        public int compareTo(Student stu) {
  43. //                int num = this.age - stu.age;
  44. //                if (num == 0) {
  45. //                        return this.name.compareTo(stu.name);
  46. //                }
  47. //                return num;
  48. //
  49. //        }

  50. }

  51. public class TreeMapDemo {
  52.         public static void main(String[] args) {
  53.                 /* 定义HashMap,里面存储的是Student和地址 */
  54.                 TreeMap<Student, String> map = new TreeMap<Student, String>(new StuNameComparator());
  55.                 map.put(new Student("java03", 23), "北京");
  56.                 map.put(new Student("net02", 21), "上海");
  57.                 map.put(new Student("net03", 26), "广州");
  58.                 map.put(new Student("java01", 24), "南京");
  59.                 map.put(new Student("net03", 26), "广州");
  60.                

  61.                 Set<Student> set = map.keySet();
  62.                 Iterator<Student> it = set.iterator();
  63.                 while (it.hasNext()) {
  64.                         Student stu = it.next();
  65.                         String name = stu.getName();
  66.                         int age = stu.getAge();
  67.                         String address = map.get(stu);
  68.                         System.out.println(name + ":" + age + ":" + address);
  69.                 }

  70.         }

  71. }
  72. public class TreeMapDemo {
  73.         public static void main(String[] args) {
  74.                 /* 定义HashMap,里面存储的是Student和地址 */
  75.                 TreeMap<Student, String> map = new TreeMap<Student, String>(new StuNameComparator());
  76.                 map.put(new Student("java03", 23), "北京");
  77.                 map.put(new Student("net02", 21), "上海");
  78.                 map.put(new Student("net03", 26), "广州");
  79.                 map.put(new Student("java01", 24), "南京");
  80.                 map.put(new Student("net03", 26), "广州");
  81.                

  82.                 Set<Student> set = map.keySet();
  83.                 Iterator<Student> it = set.iterator();
  84.                 while (it.hasNext()) {
  85.                         Student stu = it.next();
  86.                         String name = stu.getName();
  87.                         int age = stu.getAge();
  88.                         String address = map.get(stu);
  89.                         System.out.println(name + ":" + age + ":" + address);
  90.                 }

  91.         }

  92. }
复制代码
结果:
java01:24:南京
java03:23:北京
net02:21:上海
net03:26:广州



希望对你有帮助!

回复 使用道具 举报
谢谢大家,明白了!
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马