黑马程序员技术交流社区

标题: Set常用接口的子类问题 [打印本页]

作者: 邓海涛    时间: 2012-4-9 22:54
标题: Set常用接口的子类问题
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接口,谁能帮我讲下吗怎么回事吗?
作者: 李敏    时间: 2012-4-9 23:22
TreeSet 需要对存入的元素进行排序,所以我们在添加元素的时候就必须添加同一种类型的元素。
   1.元素具有比较性,需要实现comparable 接口,这样元素具有比较性。你平常添加的 String 或者Integer 成功,是因为他们都分别实现了该接口。但是不能混着添加,因为他们虽然实现了这个接口,但是实现方式不同,意思是其覆写的抽象方法内容不同。
   2.集合具有比较性,需要向TreeSet集合中传入一个比较器。

你看下一天的毕老师视频就讲到了。
作者: Eli    时间: 2012-4-9 23:26
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);       //增加姓名比较
       }
   }           

}

作者: 吴玉辉    时间: 2012-4-9 23:44
Set<Person> allSet = new TreeSet<Person>() ;
你选择用TreeSet集合存储元素,而TreeSet集合的特点是元素唯一,且元素自然排序,排序的话就涉及到了元素的比较问题,而你定义的Person类并没有比较功能,所以其子类对象无法比较,无法编译,抛出异常。
作者: 黑马-刘昌文    时间: 2012-4-10 00:16
首先:试图把一个对象添加进treeSet集合进去的时候,则该对象的类必须实现Comparable接口,否则会抛出异常!
另外 :public String gtoString(){
                 return "姓名:" + this.name + ";年龄:" + this.age ;
         }
代码中的toString()写错了开头多写了个g




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