黑马程序员技术交流社区
标题:
关于TreeSet的一个问题。
[打印本页]
作者:
彭飞
时间:
2014-5-8 15:31
标题:
关于TreeSet的一个问题。
今天看毕老师视频, 15天集合框架(TreeSet存储自定义对象) 出现了一些差异。
作者:
彭飞
时间:
2014-5-8 15:36
先给出视频里的原代码。
作者:
彭飞
时间:
2014-5-8 15:47
这2个是毕老师视频里的代码,其中只有第一行有一句没有在截图范围内:就是 import java.util.*;
视频里毕老师运行多行add时报错,当只运行一行add时候,成功编译。
然后我用Editplus 反复尝试了几次 都不能实现如此功能,
后来又把代码 复制到 MyEclipse 中,一样不可以执行。
然后我又一字一字对照,发现没有写错,
并有重开文档再次书写,结果一样,
这个时候我开始考虑到是不是JKD版本问题,
毕老师的视频是2011年的,那会是6.0 现在都用的是7.0版本的JDK。
然后我继续看视频,比老师讲解到 根据报错查看API发现Comparable特性就是
在实现该接口的时候会强行对对象进行排序,并提供给我们一个方法compareTo来实现。
然后我按照新学的知识再次应用到自己的代码上,这个时候进行2次add的时候,实现了功能,
当我实现3次add的时候,却有出现了差异,结果只输出了2个结果,
我就不能淡定了。
作者:
彭飞
时间:
2014-5-8 15:52
import java.util.*;
class TreeSetDemo
{
public static void main(String[] args)
{
TreeSet ts=new TreeSet();
ts.add(new Student("lisi02",22));
//ts.add(new Student("lisi007",20));
//ts.add(new Student("lisi09",19));
//ts.add(new Student("lisi01",40));
Iterator it=ts.iterator();
while(it.hasNext()){
System.out.println(it.next());
}
/*
for(Iterator it=ts.iterator();it.hasNext(); ){
System.out.println(it.next());
}
*/
}
}
class Student
{
private String name;
private int age;
Student(String name,int age){
this.name=name;
this.age=age;
}
public String getName(){
return name;
}
public int getAge(){
return age;
}
}
这是实现Comparable前的代码。
作者:
彭飞
时间:
2014-5-8 15:59
import java.util.*;
class Student implements Comparable//该接口让学生类具有必将性
{
private String name;
private int age;
Student(String name,int age){
this.name=name;
this.age=age;
}
public int compareTo(Object obj){
if(!(obj instanceof Student))
throw new RuntimeException(" - - !!!");
Student s=(Student)obj;
if(this.age>s.age)
return 1;
if(this.age==s.age)
return 0;
return -1;
}
public String getName(){
return name;
}
public int getAge(){
return age;
}
}
class _2TreeSetTest2
{
public static void main(String[] args) {
TreeSet ts=new TreeSet();
ts.add(new Student("lisi02",22));
ts.add(new Student("lisi009",20));
ts.add(new Student("lisi007",20));
Iterator it=ts.iterator();
while(it.hasNext()){
Student s=(Student)it.next();
sop(s.getName()+"..."+s.getAge());
}
}
public static void sop(Object obj)
{
System.out.println(obj);
}
}
复制代码
这时候是有2句 add时候,运行出2个结果,当3add时候,结果却是: 09 和09 那两句
作者:
彭飞
时间:
2014-5-8 16:02
还请各位,接解决下,问题所在,
是代码的输入错误,还是没有专心看视频,有漏掉的地方,
还是我推测的,是版本特性问题,
或者还是其他的问题。
首先声明下,该视频讲解的是 Set 集合 下 TreeSet ,
作者:
彭飞
时间:
2014-5-8 16:03
@会说话的木头 你也出现这个问题了, 囧。
作者:
彭飞
时间:
2014-5-8 16:14
-0- 没人知道怎么回事儿么。
刚刚看了看API ,6.0到7.0 也没有对该接口出现过新的优化啊。
真是纠结死了。
作者:
stamSuper
时间:
2014-5-8 16:44
哥们,,我把你的代码拷贝到我myeclipse中 ,运行的好好的啊 ,没有发现什么问题啊,不清楚你那是什么问题。
你把你出现的问题也贴出来,否则真不知道怎么解决
作者:
小麦__
时间:
2014-5-8 16:50
问题一:第二张图看不了呢。。。。。。不过代码没有问题啊。没有添加comparaTo()方法前确实不能添加第二个数据啊。以为他不知道按照什么排序啊,所以会报错啊。
问题二:然后我按照新学的知识再次应用到自己的代码上,这个时候进行2次add的时候,实现了功能,
当我实现3次add的时候,却有出现了差异,结果只输出了2个结果。
答:
ts.add(new Student("lisi02",22));
ts.add(new Student("lisi009",20));
ts.add(new Student("lisi007",20));
看你的comparaTo()方法 按照年龄自然排序,年龄一样的就不添加了(你有两个年龄为20的数据,所以最后一个lisi007,20 没有添加呢)。所以你会打印出两个结果啊。
public int compareTo(Object obj){
if(!(obj instanceof Student))
throw new RuntimeException(" - - !!!");
Student s=(Student)obj;
if(this.age>s.age)
return 1;
if(this.age==s.age)
return 0;
return -1;
}
欢迎光临 黑马程序员技术交流社区 (http://bbs.itheima.com/)
黑马程序员IT技术论坛 X3.2