黑马程序员技术交流社区

标题: 在TreeSet容器中,为什么一个元素都不能添加? [打印本页]

作者: 黑马十八期0513    时间: 2012-12-10 17:12
标题: 在TreeSet容器中,为什么一个元素都不能添加?
import java.util.*;
class TreeSetDemo
{
public static void main(String[] args)
{
  TreeSet ts =new TreeSet();
  ts.add(new Student("lisi",20));
for(Iterator it =ts.iterator();it.hasNext();)
  {
   Student stu = (Student)it.next();
   sop(stu.getName()+"..."+stu.getAge());
   
  }
}

public static void sop(Object obj)
{
  System.out.println(obj);
}
}
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;
}
}

视频中只能添加一个对象,再添加出现类型转换异常。但是我只添加了一个元素,运行的时候也发生异常!
而且比视频中还多出一个 at java.util.TreeMap.compare(TreeMap.java:1188)异常,
是哪儿出问题了?

未命名.jpg (64.75 KB, 下载次数: 87)

未命名.jpg

作者: 黑马王宁    时间: 2012-12-10 17:54
TreeSet中的对象元素需要实现Comparable接口。异常信息说的很明确。让Student实现Comparable接口,重写compareTo方法就可以了。
作者: 黑马黄涛    时间: 2012-12-10 18:26
不是这样的...我拷贝代码查看了,可以运行出来结果的(没有修改任何地方),结果:lisi...20

看下你是否保存了...以正常的思维来看 就是这个问题...
作者: 黑马黄涛    时间: 2012-12-10 18:31
嗯,你肯定是没有保存就编译了......

如果还不是,请检查路径...是不是路径错了,然后在该路径下有相同名字的java源文件(该源文件肯定添加了两次Student,并且Student对象没有实现Comparable接口)

TreeSet添加一个对象时,该对象是可以不实现Comparable方法的..编译运行可定可行...

楼主,看下编辑器的左上方,文件名之后是否还有*号,这是没保存的状态,当没有*号之后从新编译下,结果自然就出来了..

作者: 赵保磊    时间: 2012-12-10 18:32
这个异常是你没有实现Comparable接口,Set集合是能够排序的,TreeSet用于排序的方法是要存储的自定义类实现Comparable接口,并重写compareTo()方法。
实现并且重写的话可以存储多个,并根据自定义compareTo()方法进行排序。
这是修改后的代码:
import java.util.*;
class TreeSetDemo
{
public static void main(String[] args)
{
  TreeSet ts =new TreeSet();
  ts.add(new Student("lisi",20));
  ts.add(new Student("aa",20));
  ts.add(new Student("aa",20));
  ts.add(new Student("aa",18));

for(Iterator it =ts.iterator();it.hasNext();)
  {
   Student stu = (Student)it.next();
   sop(stu.getName()+"..."+stu.getAge());
   
  }

}
public static void sop(Object obj)
{
  System.out.println(obj);
}

}
class Student implements Comparable
{
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;
}

public int compareTo(Object obj)
        {
        if(!(obj instanceof Student))
                throw new RuntimeException("不是Student类");

           Student s=(Student)obj;
           int num= this.name.compareTo(s.name);
           if(num==0)
                {
                   return new Integer(this.age).compareTo(new Integer(s.age));
                }
                return num;
       
        }

}
作者: 黑马十八期0513    时间: 2012-12-10 22:10
黑马黄涛 发表于 2012-12-10 18:31
嗯,你肯定是没有保存就编译了......

如果还不是,请检查路径...是不是路径错了,然后在该路径下有相同名字 ...

这个我也很奇怪,不可能出现问题的啊,但是他就是出现问题了……有可能是我的JDK出现了问题。不过好在我把Student类实现Comparable接口后一切正常,要不然我该疯了。谢谢你认真看我的问题
作者: 黑马黄涛    时间: 2012-12-10 22:30
姜伟 发表于 2012-12-10 22:10
这个我也很奇怪,不可能出现问题的啊,但是他就是出现问题了……有可能是我的JDK出现了问题。不过好在我 ...

呵呵 没事...加油了  朋友~~




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