黑马程序员技术交流社区

标题: TreeSet 遍历问题 [打印本页]

作者: liguangcaiup    时间: 2013-6-14 19:52
标题: TreeSet 遍历问题
本帖最后由 liguangcaiup 于 2013-6-16 12:40 编辑

直接上源码   为什么打印的是 如 stu@1fb8ee3  而不是学生信息?  
class stu {   //学生类
        String m_name;
        int m_age;
        int m_score;

        public stu(String name, int age, int score) {
                m_name = name;
                m_age = age;
                m_score = score;
        }
}

public static void main(String[] args) {
                TreeSet<stu> stus = new TreeSet<stu>(new stuComparator());
                for(int i =0;i<5;i++)
                        stus.add(new stu("li"+i,20,80+i));  //创建5个stu对象
                System.out.println(stus);
}
作者: ㄗs:/|丶hearts    时间: 2013-6-14 20:51
stus 是一个对象  System.out.println(stus); 打印的是stus的地址
作者: luckwei    时间: 2013-6-14 21:15
System.out.print(stus)是打印的学生对象的引用地址值,如果想打印学生信息,可以这样定义一个获取信息的get方法,在System.out.println()里调用
作者: 苑永志    时间: 2013-6-15 02:20
楼主请听我慢慢道来:
楼主的打印结果应该是类似:[com.hunnu.day3.stu@da4b71, com.hunnu.day3.stu@18f1d7e, com.hunnu.day3.stu@d9660d, com.hunnu.day3.stu@bb0d0d, com.hunnu.day3.stu@55e55f]
这样,我们不难看到[]中的5个元素应该是与5个stu对象相关的5个值,到底是什么呢?通过观察Object的toString()方法
  1. public String toString() {
  2.         return getClass().getName() + "@" + Integer.toHexString(hashCode());
  3.     }
复制代码
可以看出打印出来的[]中的内容是分别调用各个stu对象的toString()方法返回的字符串。这样一来,问题就变得简单了,为了打印出stu的相关信息,我们只需在stu类中重写toString()方法即可
  1. @Override
  2.         public String toString() {
  3.                 return "[m_name=" + m_name + ", m_age=" + m_age + ", m_score="
  4.                                 + m_score + "]";
  5.         }
复制代码
运行之后打印出来的结果就该类似这样:[[m_name=li0, m_age=20, m_score=80], [m_name=li1, m_age=20, m_score=81], [m_name=li2, m_age=20, m_score=82], [m_name=li3, m_age=20, m_score=83], [m_name=li4, m_age=20, m_score=84]]。

相信到这里楼主应该能够理解了。实际上很多情况,对象的toString()方法都会默认的被调用,比如打印对象的时候,与字符串相加的时候等。

说到最后,还是要说一下,类名的第一个字母要大写呀,这是编程的好习惯,要养成才好。
作者: 郭天龚    时间: 2013-6-15 11:10
你这个问题我也遇到过,我也是在看毕老师视频的时候看到老师这样打印一个对象。后来我也这样打印的时候发现时地址值。
我回看视频的时候发现毕老师打印的是字符串对象。这是我明白了。正如苑永志所说System.out.println()这个打印方法是
调用自身的toStrin方法的。而字符串已经复写了这个方法所以可以这样打印。所以这个疑惑有两个方法解决。就是楼上大侠们所说
1.在你的类中写3个获取属性的方get方法然后这样打印 System.out.println(stus.getname()+stu.getAge()+stu.getScore())
2.复写继承自Object中toString方法
作者: 知行    时间: 2013-6-15 21:38
是的需要覆盖该类的toString()方法。
作者: liguangcaiup    时间: 2013-6-16 00:03
苑永志 发表于 2013-6-15 02:20
楼主请听我慢慢道来:
楼主的打印结果应该是类似:[com.hunnu.day3.stu@da4b71, com.hunnu.day3.stu@18f1d7 ...

是这样的! 今天看了毕老师视频也讲到这个了。谢啦  好熟悉的id和头像,我有一个帖子也是你给的答案
作者: 邹晓慧    时间: 2013-6-17 21:24
因为你没重写toString方法
作者: xiaobei56    时间: 2015-12-24 09:22
。。。。。。。。。。。。。。
作者: 嘻嘻呵呵    时间: 2017-6-6 11:52
public class HashSetDemo {          /**          * @param args          */         public static void main(String[] args) {                 // TODO Auto-generated method stub                 TreeSet<Person> set = new TreeSet<>();                 set.add(new Person("张三",23));                 set.add(new Person("李四",24));                 set.add(new Person("王五",25));                                  Iterator<Person> iterator = set.iterator();                 while(iterator.hasNext()){                         System.out.println(iterator.next());                 }         }  }
作者: 嘻嘻呵呵    时间: 2017-6-6 11:54
public class HashSetDemo {

        /**
         * @param args
         */
        public static void main(String[] args) {
                // TODO Auto-generated method stub
                TreeSet<Person> set = new TreeSet<>();
                set.add(new Person("张三",23));
                set.add(new Person("李四",24));
                set.add(new Person("王五",25));
               
                Iterator<Person> iterator = set.iterator();
                while(iterator.hasNext()){
                        System.out.println(iterator.next());
                }
        }

}

public class Person implements Comparable<Person>{
        private String name;
        private int age;
        public Person(String name, int age) {
                this.name = name;
                this.age = age;
        }
        @Override
        public String toString() {
                return "name=" + name + ", age =" + age;
        }
        @Override
        public int compareTo(Person o) {
                // TODO Auto-generated method stub
                return this.age - o.age > 0? 1:-1;
        }
       
}





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