黑马程序员技术交流社区
标题:
关于TreeSet问题
[打印本页]
作者:
胡卿
时间:
2012-6-18 14:40
标题:
关于TreeSet问题
本帖最后由 胡卿 于 2012-6-18 14:49 编辑
import java.util.*;
class Student implements Comparable
{
private String name;
private int age;
private int grade;
public int compareTo(Object obj)
{
Student s = (Student)obj;
int num = new Integer(this.grade).compareTo(new Integer(s.grade));
return num==0?new Integer(this.age).compareTo(new Integer(s.age)):num;
}
public Student(String name,int age,int grade)
{
this.name = name;
this.age = age;
this.grade = grade;
}
public String getName()
{
return name;
}
public void setName(String name)
{
this.name = name;
}
public int getAge()
{
return age;
}
public void setAge(int age)
{
this.age = age;
}
public int getGrade()
{
return grade;
}
public void setGrade(int grade)
{
this.grade = grade;
}
}
class MyCompare implements Comparator
{
public int compare(Object o1,Object o2)
{
Student s1=(Student)o1;
Student s2=(Student)o2;
int num=new Integer(s2.getGrade()).compareTo(new Integer(s1.getGrade()));
return num==0?new Integer(s2.getAge()).compareTo(new Integer(s1.getAge())):num;
}
}
class Test6
{
public static void main(String[] args)
{
TreeSet ts= new TreeSet(new MyCompare());
ts.add(new Student("张三",20,86));
ts.add(new Student("李四",21,86));
ts.add(new Student("王五",19,88));
ts.add(new Student("周六",18,87));
ts.add(new Student("吴七",22,95));
//System.out.println(ts)这里不是打印集合么 ,为什么出现的是哈希值
Iterator it=ts.iterator();
while(it.hasNext())
{
System.out.println("姓名"+it.next().getName()+"年龄"+it.next().getAge()+"分数"+it.next().getGrade());//这里的方法为什么不能被识别
}
}
}
复制代码
作者:
唐辉辉
时间:
2012-6-18 14:45
本帖最后由 唐辉辉 于 2012-6-18 14:50 编辑
//System.out.println(ts)这里不是打印集合么 ,为什么出现的是哈希值
因为ts集合里存放的是对象,对象在内存中存放是以哈希值来存放的,在放入ts集合中的也是对象的哈希值。
System.out.println("姓名"+it.next().getName()+"年龄"+it.next().getAge()+"分数"+it.next().getGrade());//这里的方法为什么不能被识别
it.next()需强制转换成Student对象后,才可调用Student类中的成员。
如:
Student stu = (Student)it.next();
System.out.println("姓名"+stu.getName()+"年龄"+stu.getAge()+"分数"+stu.getGrade());
如果不想转换的话,可以定义ts集合和It 时指定其接收的类型。 如下:
TreeSet<Student> ts= new TreeSet
<Student>
(new MyCompare());
Iterator
<Student>
it=ts.iterator();
System.out.println("姓名"+it.next().getName()+"年龄"+it.next().getAge()+"分数"+it.next().getGrade());
作者:
胡卿
时间:
2012-6-18 14:47
唐辉辉 发表于 2012-6-18 14:45
//System.out.println(ts)这里不是打印集合么 ,为什么出现的是哈希值
因为ts集合里存放的是对象,对象在 ...
谢啦
我自己晕了
作者:
黑马—陈磊
时间:
2012-6-18 14:51
本帖最后由 黑马—陈磊 于 2012-6-18 14:52 编辑
Iterator it=ts.iterator();
while(it.hasNext())
{
Student stu=(Student)it.next(); //在循环遍历时还需强转成学生对象
System.out.println("姓名"+stu.getName()+"年龄"+stu.getAge()+"分数"+stu.getGrade());
}
作者:
黄连兵
时间:
2012-6-18 14:56
System.out.println(ts)这里不是打印集合么 ,为什么出现的是哈希值
这可以参考API,其中println方法中最接近的一个就是:public void println(Object x)
此方法首先调用 String.valueOf(x) 获取打印对象的字符串值,然后的行为如同先调用 print(String) 再调用 println() 一样。
所以你只能得到哈希值。
System.out.println("姓名"+it.next().getName()+"年龄"+it.next().getAge()+"分数"+it.next().getGrade());//这里的方法为什么不能被识别
因为你的Iterator it=ts.iterator();没有使用泛型,此处返回的是object,所以不识别你的方法。
Iterator <Student>it=ts.iterator();
加上类型限定,就可以了~!
作者:
常佳杰
时间:
2012-6-18 15:01
打印集合需通过遍历来打印哦,
记得无论是Set,List,Map任何一个集合都要通过遍历来打印...
尤其是Map需通过调用EntrySet()方法来调用set集合里的Iterator来遍历....
TreeSet ts= new TreeSet();
Set st = new TreeSet();
无论是ts,还是st,都是一个对象,他里边存的都是对象的引用地址,
写代码时一定要切记,细节,细节决定成败
欢迎光临 黑马程序员技术交流社区 (http://bbs.itheima.com/)
黑马程序员IT技术论坛 X3.2