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接口在意义上有什么区别?谢谢大家啦~!
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接口在意义上有什么区别?谢谢大家啦~!
TreeSet<Object> ts=new TreeSet<Object>();class MyStudents implements Comparator<Object>楼主,有这样的写法吗?
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型
{
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根据指定的比较器来进行排序, 一般这里会使用匿名内部类的用法...
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方法要实现起来就非常困难了.
我觉得你说得有道理,这是一个需要修改的地方。
我把String类型的元素注释掉,只加入MyStudents类型的元素,但也抛出同样的异常。
又是为什么呢?