import java.util.*;
class TreeSetTest
{
public static void main(String[] args)
{
TreeSet<Object> ts=new TreeSet<Object>();
ts.add("vida");
ts.add("Lillian");
ts.add("Chaner");
ts.add(new MyStudents(2,"Vida"));
ts.add(new MyStudents(4,"Lillian"));
ts.add(new MyStudents(1,"Chaner"));
ts.add(new MyStudents(2,"Vida"));
Iterator it=ts.iterator();
while(it.hasNext())
{
System.out.println(it.next());
}

}

}class MyStudents implements Comparator<Object>
{
int number;
String name;
MyStudents(int number,String name)
{
this.number=number;
this.name=name;
}
public String toString()
{
return "The Student's information is: Number="+number+" name="+name;
}
public int compare(Object o1,Object o2)
{
MyStudents mst1=(MyStudents)o1;
MyStudents mst2=(MyStudents)o2;
int result=mst1.number>mst2.number?1:(mst1.number==mst2.number?0:-1);
if(result==0)
{
return mst1.name.compareTo(mst2.name);
}
return result;

}
}顺便问个白痴问题java.lang的Comparable接口与java.util中的Comparator接口在意义上有什么区别?谢谢大家啦~!

解决方案 »

  1.   


    TreeSet<Object> ts=new TreeSet<Object>();class MyStudents implements Comparator<Object>楼主,有这样的写法吗?
      

  2.   

    ts.add("vida");
    ts.add("Lillian");
    ts.add("Chaner");
    ts.add(new MyStudents(2,"Vida"));
    ts.add(new MyStudents(4,"Lillian"));
    ts.add(new MyStudents(1,"Chaner"));
    //----------------------
    前后放入的对象不同,前面放入的是String型,而后面的去是MyStudents型
      

  3.   

    class MyStudents implements Comparable<Object>
    {
    int number;
    String name;
    MyStudents(int number,String name)
    {
    this.number=number;
    this.name=name;
    }
    public String toString()
    {
    return "The Student's information is: Number="+number+" name="+name;
    }
    public int compareTo(Object obj)
    {
    if (obj.getClass() != this.getClass())
    return -1;
    MyStudents stu = (MyStudents) obj;
    int result=this.number>stu.number?1:(this.number==stu.number?0:-1);
    if(result==0)
    {
    return this.name.compareTo(stu.name);
    }
    return result; }
    }你应该实现Comparable而不是Comparator, 你的程序抛出ClassCastException异常是因为: add()方法中指定的对象不能与 TreeSet 中的已有元素进行比较。TreeSet实现依赖于equals方法和实现Comparable接口的compareTo()方法.要使用TreeSet, 你必须保证添加到set中的所有对象的类都实现了Comparable接口, 并且对象之间可以互相比较. 比如你的例子, 必须使得String类型和MyStudentS类型的对象可以比较.你对Comparator的用法是错误的, 在TreeSet创建时, 你可以指定一个Comparator, 让TreeSet根据指定的比较器来进行排序, 一般这里会使用匿名内部类的用法...
      

  4.   

    下面是使用Comparator的例子:
    class TreeSetTest
    {
    public static void main(String[] args)
    {
    TreeSet<Object> ts=new TreeSet<Object>(new
    Comparator<Object>()
    {
    public int compare(Object obj1, Object obj2)
    {
    // 这里简单的返回-1, 使TreeSet按插入顺序的相反顺序进行对象的排序
    return -1;
    }
    });
    ts.add("vida");
    ts.add("Lillian");
    ts.add("Chaner");
    ts.add(new MyStudents(2,"Vida"));
    ts.add(new MyStudents(4,"Lillian"));
    ts.add(new MyStudents(1,"Chaner"));
    ts.add(new MyStudents(2,"Vida"));
    ts.add("zhangqiwen");
    ts.add("abc");
    Iterator it=ts.iterator();
    while(it.hasNext())
    {
    System.out.println(it.next());
    } }}TreeSet不应该像楼主这样使用, String类型和MyStudents没有任何逻辑上的联系, 为什么要添加到一起去呢? TreeSet<Object>使用Comparator<Object>作为比较器, 你必须实现compare(Object, Object)方法确实比较的规则, 但实际上这个TreeSet可以添加任何类型的对象. 那你的compare方法要实现起来就非常困难了.
      

  5.   

    jk88811(jkzqw)你的意见我的理解是:主要原因出在两个不同类型的元素不能比较。是吗?
    我觉得你说得有道理,这是一个需要修改的地方。
    我把String类型的元素注释掉,只加入MyStudents类型的元素,但也抛出同样的异常。
    又是为什么呢?