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

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© 陈欢 中级黑马   /  2012-7-20 22:37  /  1710 人查看  /  3 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

public class Test
{
  public static void main(String[] args)
  {
    List<Roleright> list = new ArrayList<Roleright>();
    list.add(new Roleright());
    list.add(new Roleright());
    list.add(new Roleright());
    Set<Roleright> set = new TreeSet<Roleright>();
    set.addAll(list);
  }
}


//做了一个集合的练习程序,为什么出现这个错误提示呢,是哪里用错了呢,

Exception in thread "main" java.lang.ClassCastException: entity.Roleright
at java.util.TreeMap.compare(Unknown Source)
at java.util.TreeMap.put(Unknown Source)
at java.util.TreeSet.add(Unknown Source)
at java.util.AbstractCollection.addAll(Unknown Source)
at java.util.TreeSet.addAll(Unknown Source)
at Test.main(Test.java:18)

3 个回复

倒序浏览
楼主,放在TreeSet里的自定义对象是需要比较器的,import java.util.*;
class Mycompare implements Comparator<Student>
{
        public int compare(Student s,Student s1)
        {
                int num = s.getAge()-s1.getAge();
                return num==0?s.getName().compareTo(s1.getName()):num;
        }
}
class Student implements Comparable<Student>
{
        private String name;
        private int age;
        public void setName(String name)
        {
                this.name=name;//这里是将外界传过来的值付给了成员变量。
        }
        public String getName()
        {
                return name;
        }
        public void setAge(int age)
        {
                this.age=age;//这里是将外界传过来的值付给了成员变量。
        }
        public int getAge()
        {
                return age;
        }
        public String toString()
        {
                return this.name+"****"+this.age;
        }
        public int compareTo(Student s)
        {
                int num = this.name.compareTo(s.name)
                return num==0?(this.age-s.age):num;
        }
}
class TreeSetDemo4
{
        public static void main(String[] args)
        {       
                TreeSet<Student> st = new TreeSet();
                //TreeSet<Student> st = new TreeSet(new Mycompare());
                //传递比较器,拓展功能。
                Student s = new Student();
                s.setName("aixi");
                s.setAge(45);
                Student s1 = new Student();
                s1.setName("heihei");
                s1.setAge(45);
                Student s2 = new Student();
                s2.setName("aaa");
                s2.setAge(47);
                st.add(s);
                st.add(s1);
                st.add(s2);//注意s1和s2重复了。
                Iterator<Student> it = st.iterator();
                while (it.hasNext())
                {
                        Student sty = it.next();

                        System.out.println(sty);
                }
        }
}

评分

参与人数 1技术分 +1 收起 理由
蒋映辉 + 1

查看全部评分

回复 使用道具 举报
set集合李的元素是是通过元素的两个方法,hashCode和equals是否为true来完成判断两个元素是否重复.
如果元素的HashCode值相同,才会判断equals是否为true,
如果元素的HashCode值不同,才会调用equals.
所以我们在建立对象,并需要存储进集合中时,一般都要复写他们的HashCode和equals方法,因为如果不复写,往往都是以内存地址值来判断hash值,就算内容一样,也视为不同对象,不符合我们的应用要求.

用毕老师的话来说,要么你让Set集合里的元素具备比较性,也就是实现Comparable接口,覆盖hashCode和equals方法.
要么就自定义比较器,实现Comparetor接口.然后将自定义比较器传给set集合.

评分

参与人数 1技术分 +1 收起 理由
蒋映辉 + 1

查看全部评分

回复 使用道具 举报
哦,我大概明白了,谢谢
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马