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

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© 张振纲 中级黑马   /  2012-8-7 13:04  /  1340 人查看  /  3 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

本帖最后由 张振纲 于 2012-8-7 13:24 编辑
  1. import java.util.*;

  2. class Person
  3. {
  4. private String name;
  5. private int age;
  6. Person(String name, int age)
  7. {
  8. this.name=name;
  9. this.age=age;
  10. }

  11. public int getAge()
  12. {
  13. return age;
  14. }

  15. public String getName()
  16. {
  17. return name;
  18. }
  19. }

  20. class Mycom implements Comparator<Person>
  21. {
  22. public int compare(Person a ,Person b)
  23. {
  24. int c = new Integer(a.getAge()).compareTo(new Integer (b.getAge()));
  25. if (c==0)
  26. {
  27. return a.getName().compareTo(b.getName());
  28. }
  29. return c ;
  30. }
  31. }

  32. class TreeSetDemo2
  33. {
  34. public static void main(String[] args)
  35. {
  36. TreeSet<Person> ts = new TreeSet<Person>(new Mycom());

  37. ts.add(new Person("dafsd",13));
  38. ts.add(new Person("sda",12));
  39. ts.add(new Person("weqd",14));
  40. ts.add(new Person("dawsd",17));

  41. Iterator<Person> it = ts.iterator();
  42. while (it.hasNext())
  43. {
  44. System.out.println(it.next().getName()+"-----"+it.next().getAge());
  45. }
  46. }
  47. }
复制代码
以下为输出结果



通过建立一个比较器
让对象使用比较器存入TreeSet中
比较方法没有错误
可是为什么输出结果只有两个?


评分

参与人数 1技术分 +1 收起 理由
张立江 + 1

查看全部评分

3 个回复

倒序浏览
本帖最后由 马州州 于 2012-8-7 13:28 编辑


Iterator it = ts.iterator();
while (it.hasNext())
{
System.out.println(it.next().getName()+"-----"+it.next().getAge());
   楼主在输出的时候出问题了下面详解一下
你最后输出的时候用了两个it.next,在运行的时候第一个it.next().getName()执行完之后,指针指向了下一个it.next().getAge(),比较的时候调用it.next()了,那么下面继续进行比较的时候就不会再调用了,也就是说输出的时候,不是一个一个进去的,是两个两个进去的,这样再输出的时候就会漏掉两个,可以这样改一下代码,把取出来的数据先保存一下,再进行调用输出

while (it.hasNext())
{
Person s = it.next();
System.out.println(s.getName()+"-----"+s.getAge());
}

评分

参与人数 1技术分 +1 收起 理由
张立江 + 1 很给力!

查看全部评分

回复 使用道具 举报
while (it.hasNext())
{
        System.out.println(it.next().getName()+"-----"+it.next().getAge());
}
在你的类中因为你已经定义好了比较器,让学生具备排序的比较性,先按照年龄比,再按照年龄比,所以在TreeSet集合中4个对象的排序应该是
p1=new Person("sda",12);
p2=new Person("dafsd",13);
p3=new Person("weqd",14);
p4=new Person("dawsd",17);
我给他们起个名字比较好说明,当调用一次it.hasNext()方法时,是true,所以在输出语句中执行it.next().getName()这句话,打印了p1的姓名,
这时执行it.next().getAge()这句话的时候又调用了一次it.next()这个方法指向了下一个对象,将p2的年龄给打印出来了,忽略了p1的年龄,
以此类推,所以结果就成那样了。
可以将代码做个小小的修改,如下则不会出错了。
while (it.hasNext())
{
        Person p=it.next();
        System.out.println(p.getName()+"-----"+p.getAge());
}
希望可以对楼主有所帮助。
回复 使用道具 举报
直接在Person类里面复写toString()
  1. public String toString(){
  2.         return this.name+" "+this.age;
  3. }
复制代码
这样就会避免这个问题
while (it.hasNext())
{
System.out.println(it.next());
}
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马