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

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© 邓海涛 中级黑马   /  2012-4-9 22:54  /  1810 人查看  /  4 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

import java.util.Set ;
import java.util.TreeSet ;
class Person{
        private String name ;
        private int age ;
        public Person(String name,int age){
                this.name = name ;
                this.age = age ;
        }
        public String gtoString(){
                return "姓名:" + this.name + ";年龄:" + this.age ;
        }
};
public class TreeSetDemo{
        public static void main(String args[]){
                Set<Person> allSet = new TreeSet<Person>() ;
                allSet.add(new Person("张三",30)) ;
                allSet.add(new Person("李四",31)) ;
                allSet.add(new Person("王五",32)) ;
                allSet.add(new Person("王五",32)) ;
                allSet.add(new Person("王五",32)) ;
                allSet.add(new Person("赵六",33)) ;
                allSet.add(new Person("孙七",33)) ;
                System.out.println(allSet) ;
        }
};

抛了这个异常:
Exception in thread "main" java.lang.ClassCastException: cn.dan.wenti.Person cannot be cast to java.lang.Comparable
        at java.util.TreeMap.put(TreeMap.java:542)
        at java.util.TreeSet.add(TreeSet.java:238)
        at cn.dan.wenti.Test7.main(TreeSetDemo.java:20)

说没有实现Comparable接口,谁能帮我讲下吗怎么回事吗?

评分

参与人数 1技术分 +1 收起 理由
岳民喜 + 1

查看全部评分

4 个回复

正序浏览
首先:试图把一个对象添加进treeSet集合进去的时候,则该对象的类必须实现Comparable接口,否则会抛出异常!
另外 :public String gtoString(){
                 return "姓名:" + this.name + ";年龄:" + this.age ;
         }
代码中的toString()写错了开头多写了个g
回复 使用道具 举报
Set<Person> allSet = new TreeSet<Person>() ;
你选择用TreeSet集合存储元素,而TreeSet集合的特点是元素唯一,且元素自然排序,排序的话就涉及到了元素的比较问题,而你定义的Person类并没有比较功能,所以其子类对象无法比较,无法编译,抛出异常。
回复 使用道具 举报
TreeSet中的元素是有序存放的,所以对于一个对象就应该要指定排序规则吧
TreeSet中的每个对象所在的类都必须实现Comparable接口才可以正常使用的。

class Person implements Comparable<Person>{
        private String name ;
        ...
        ...
        public String toString(){
                return "姓名:" + this.name + ";年龄:" + this.age ;
        }
        public int compareTo(Person per){     //指定排序规则
              if(this.age>per.age){
                         return 1;
       }else if(this.age<per.age){
                         return -1;
       } else{
                        return this.name.compareTo(per.name);       //增加姓名比较
       }
   }           

}
回复 使用道具 举报
TreeSet 需要对存入的元素进行排序,所以我们在添加元素的时候就必须添加同一种类型的元素。
   1.元素具有比较性,需要实现comparable 接口,这样元素具有比较性。你平常添加的 String 或者Integer 成功,是因为他们都分别实现了该接口。但是不能混着添加,因为他们虽然实现了这个接口,但是实现方式不同,意思是其覆写的抽象方法内容不同。
   2.集合具有比较性,需要向TreeSet集合中传入一个比较器。

你看下一天的毕老师视频就讲到了。
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马