import java.util.*;
class Test_Set
{
        private int id;
        private String name;
      public int getId() {
return id;
}
public void setId(int id) {
this.id = id;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public int hashCode()
{
return id;
}
}
public class Student
{
public static void main(String[] args)
{
Set set=new HashSet();
Hash_Set hs=new Hash_Set();
Hash_Set hs2=new Hash_Set();
Hash_Set hs3=new Hash_Set();
Hash_Set hs4=new Hash_Set();

hs.setId(01);
hs.setName("li");

hs2.setId(02);
hs2.setName("wang");

hs3.setId(03);
hs3.setName("zhang");

hs4.setId(01);
hs4.setName("li");

set.add(hs);
set.add(hs2);//为什么执行到这一句发生了ClassCastException异常,为什么就只能添加一个元素啊?
set.add(hs3);
set.add(hs4);
Iterator it=set.iterator();
while(it.hasNext())
{
Object obj=it.next();
Hash_Set hs5=(Hash_Set)obj;
System.out.println(hs5.getId()+":"+hs5.getName());
}
}}
set.add(hs2);//为什么执行到这一句发生了ClassCastException异常,为什么就只能添加一个元素啊?

解决方案 »

  1.   

    发生ClassCastException异常是在把
    Set set=new HashSet();
    改成
    Set set=new TreeSet();的情况下发生的。
      

  2.   

    Test_Set类要实现Comparable接口才可以,实现compareTo(Object o)方法及equals(),hascode()方法
    然后再添加就可以了.
      

  3.   

    原因是:TreeSet实现了SortedSet接口,能够进行自动排序,
    所以自定义类必须要实现Comparable接口(不然怎么进行自动排序)
      

  4.   


    你说的这个是treeset内部实现的 不用我们自己在写了。。
    楼主,你可以先将数据加在list里,然后把list放进set里就可以了哈。 给你写一个例子吧:import java.util.ArrayList;
    import java.util.Collection;
    import java.util.HashSet;
    import java.util.Iterator;
    import java.util.Set;
    import java.util.TreeSet;/**
     * @功能:实现一个HashSet和TreeSet的例子
     * @author JackRui
     * @时间:2009.03.31
     */
    public class SetDemo {
            
            private static void printCol(Collection coll){
                    Iterator iter = coll.iterator();
                    while(iter.hasNext()){
                            System.out.println(iter.next());
                    }
            }
            
            public static void main(String[] args) {
                    Collection coll = new ArrayList();
                    coll.add("c");
                    coll.add("a");
                    coll.add("b");
                    coll.add("a");
                    
                    Set set1 = new HashSet();
                    Set set2 = new TreeSet();
                    
                    set1.addAll(coll);
                    set2.addAll(coll);
                    
                    System.out.println("现在开始打印HashSet的内容: ");
                    printCol(set1);
                    System.out.println("现在开始打印TreeSet的内容: ");
                    printCol(set2);
                            }}
      执行结果如下:
    现在开始打印HashSet的内容: 
    a
    c
    b
    现在开始打印TreeSet的内容: 
    a
    b
    c
      

  5.   

    Test_Set必须实现 Comparable接口,以使得TreeSet可以正常工作,否则就是会出现异常
      

  6.   


    你向集合里添加自定义对象试试看你的方法行不行得通???
    String类型已经实现了compareTo方法的
      

  7.   

    这个是正确的;4楼里添加的是String对象,而String类里面有equals()、compareTo等方法的实现;
      

  8.   


    import java.util.*;
    public class Test_Set implements Comparable
    {
    private int id;
    private String name;

    public int getId() {
    return id;
    }
    public void setId(int id) {
    this.id = id;
    }
    public String getName() {
    return name;
    }
    public void setName(String name) {
    this.name = name;
    }
    public int hashCode()
    {
    return id;
    }
    public boolean equals(Object obj)
    {
    if(obj==null)
    {
    return false;
    }
    if(obj instanceof Test_Set)
    {
    Test_Set hs=(Test_Set)obj;
    if(id==hs.id)
    {
    if(this.name==hs.name)
    return true;
    }
    }
    return false;
    }
    public int compareTo(Object obj)
    {
    int result=0;
    if(obj!=null && obj instanceof Test_Set)
    {
    Test_Set hs=(Test_Set)obj;
    if(id>hs.id)
    result=1;
    else if(id<hs.id)
    result=-1;
    else
    {
    result=0;
    }
    }
    return result;

    }
    }按照大家给的建议,我实现了Comparable接口,并重写了hashCode(),equals(),compareTo()这三个方法。运行正常了。
    我想问一下,这三个方法的写法是不是按照我的这个写法就行了,不需要什么变更吗?实现Comparable接口,实现三个方法,是在什么情况下才要做的呢?现在是会写了,但理论方面还有点不明白。
      

  9.   


    1.Set集合中是不存在重复元素的,所以你要实现hashcode()与equals()方法,
      判断时,首先判断对象间hashcode()返回值是否相等,若不相等,则对象不等。
      若hashcode()相等,再进行equals()判断。
    2.TreeSet是能够自动排序的,所以你要实现Comparable接口,重写compareTo()方法,根据compareTo()方法进行排序。
    3.要判断对象是否相等时,重写hashcode()与equals();要进行排序时,重写compareTo()。
    4.楼主可以结贴了,呵呵~~