黑马程序员技术交流社区

标题: 一个TreeSet集合的问题 [打印本页]

作者: 吴海松    时间: 2015-1-2 23:13
标题: 一个TreeSet集合的问题
谁帮我看看这个集合为什么第一个存进去的值是null呢,当我存的是两个元素的时候就不是null,结果就对的,当我存超过三个的时候有的就是存不了进去,键存进去了,值部分没存进去,结果是null,所以说Student这个类就每什么问题了,也不知道是不是JDK1.8的问题还是什么,谁帮帮看看这个代码吧,谢谢了!

  1. import java.util.Comparator;
  2. import java.util.HashMap;
  3. import java.util.Iterator;
  4. import java.util.Map;
  5. import java.util.Map.Entry;
  6. import java.util.Set;
  7. import java.util.TreeMap;
  8. import java.util.TreeSet;

  9. class Test {
  10.         public static void main(String[] agrs) {
  11.                 TreeMap<Student,String> room2=new TreeMap<Student, String>();
  12.                 room2.put(new Student("赵六",26),"广东");
  13.                 room2.put(new Student("李四",20),"广西");
  14.                  room2.put(new Student("王五",24),"广州");
  15.                 room2.put(new Student("黄五",23),"上海");
  16.                 room2.put(new Student("曾七",21),"北京");
  17.                 room2.put(new Student("曾七",20),"北京");
  18.                 get(room2);
  19.         }

  20.         public static void get(TreeMap t){//获取集合元素,打印方法
  21.                 Set s=t.keySet();
  22.                 Iterator it=s.iterator();
  23.                 while(it.hasNext()){
  24.                         Student key=(Student)it.next();
  25.                         String value=(String)t.get(key);
  26.                         System.out.println(key.name+":"+key.age+"="+value);
  27.                 }
  28.         }
  29.        
  30. }
  31. class Student implements Comparable{//学生类
  32.         String name;
  33.         int age;
  34.         Student(String name,int age){
  35.                 this.name=name;
  36.                 this.age=age;
  37.         }
  38.         public int compareTo(Object obj){
  39.                 //System.out.println("zhi");
  40.                 if (!(obj instanceof Student)) {
  41.                         throw new RuntimeException("类型错误");
  42.                 }
  43.                 Student std=(Student)obj;
  44.                 int nub=this.name.compareTo(std.name);
  45.                 if (nub==0) {
  46.                         return new Integer(this.age).compareTo(std.age);
  47.                 }
  48.                         return 1;
  49.         }
  50. }
复制代码

作者: 吴海松    时间: 2015-1-2 23:40
你帮运行一下,告诉一下我结果?
作者: 雪落纷飞    时间: 2015-1-3 01:18
解释不通,等大神吧,只知道吧返回值改成nub没问题,为什么一面排会出现null也醉了
作者: 云兮丶    时间: 2015-1-3 09:16
:)看下最后一句的返回值。我感觉问题在那里
作者: 446111220    时间: 2015-1-3 10:20
学习一下
作者: xiao飞    时间: 2015-1-3 10:45
学生类的,返回值应该是nub  不是 ,  还是就是 集合加了泛型,你的Iterator 也要泛型  Set也必须要泛型  不然是不安全的,  泛型可以避免强转
作者: hello_csu    时间: 2015-1-3 13:51
       稍微Debug分析了一下子,其实存放的时候没有任何问题, 都存放到TreeMap中去了,但是在遍历的时候,发现出现了问题。因遍历的过程算法被
封装了,看不到。所以不知道他查找算法是怎么写的,但从我debug来看,个人认为也许其查找算法有瑕疵,考虑的不特别全面,导致特殊树型结构可能
没有被处理好。
       目前暂时认为修改就是:compare函数中不要强制访问一个值,搞个极端的树,这个写法其实你根本就没有做什么排序处理。
  1. public int compareTo(Object obj){
  2.                 //System.out.println("zhi");
  3.                 if (!(obj instanceof Student)) {
  4.                         throw new RuntimeException("类型错误");
  5.                 }
  6.                 Student std=(Student)obj;
  7.                 int nub=this.name.compareTo(std.name);
  8.                 if (nub==0) {
  9.                         return new Integer(this.age).compareTo(std.age);
  10.                 }
  11.                         return 1;  --》<b>return nub</b>
  12.         }
复制代码



作者: run_wind    时间: 2015-1-3 15:41
问你个问题啊,你为什么要实现comparable呢,是为了使元素具备比较性么?那你的目的如果是这个,为什么要固定返回1?返回nub不好么
作者: 小小志    时间: 2015-1-3 20:02
  1. package Test3;
  2. import java.util.Iterator;
  3. import java.util.Set;
  4. import java.util.TreeMap;

  5. public class Deno1111 {
  6.         public static void main(String[] agrs) {
  7.                 TreeMap<Student,String> room2=new TreeMap<Student, String>();
  8.                /* room2.put(new Student("赵六",26),"广东");
  9.                 room2.put(new Student("李四",20),"广西");
  10.                 room2.put(new Student("王五",24),"广州");
  11.                 room2.put(new Student("黄五",23),"上海");
  12.                 room2.put(new Student("曾七",21),"北京");
  13.                 room2.put(new Student("曾七",20),"北京"); */
  14.                 room2.put(new Student("1",26),"广东");
  15.                 room2.put(new Student("2",20),"广西");
  16.                 room2.put(new Student("3",24),"广州");
  17.                 room2.put(new Student("4",23),"上海");
  18.                 room2.put(new Student("5",21),"北京");
  19.                 room2.put(new Student("5",20),"北京");
  20.                
  21.                 get(room2);
  22.         }

  23.         public static void get(TreeMap<Student,String>  t){//获取集合元素,打印方法
  24.                 Set<Student> s=t.keySet();
  25.                 Iterator<Student> it=s.iterator();
  26.                 while(it.hasNext()){
  27.                         Student key=(Student)it.next();
  28.                         String value=(String)t.get(key);
  29.                         System.out.println(key.name+":"+key.age+"="+value);
  30.                 }
  31.         }
  32.         
  33. }
  34. class Student implements Comparable<Student>
  35. {//学生类
  36.         String name;
  37.         int age;
  38.         Student(String name,int age){
  39.                 this.name=name;
  40.                 this.age=age;
  41.         }
  42.         @Override
  43.                 public int compareTo(Student obj) {
  44.                         // TODO Auto-generated method stub
  45.                          if (!(obj instanceof Student)) {
  46.                  throw new RuntimeException("类型错误");
  47.          }
  48.          Student std=(Student)obj;
  49.          int nub=this.name.compareTo(std.name);
  50.          return nub==0?new Integer(this.age).compareTo(std.age):nub;
  51.         
  52.                 }
  53. }
复制代码

你这样试试就知道哪错了 ? 你的比较方法怎么看着都别扭
作者: 红楼    时间: 2015-1-3 21:49
都好厉害啊




欢迎光临 黑马程序员技术交流社区 (http://bbs.itheima.com/) 黑马程序员IT技术论坛 X3.2