作为Set集合的子类,TreeSet也不能存储重复元素,而且他要求存入的对象必须实现compareTo方法,不然他无法决定每个元素在二叉树里的位置,会报这个错:
Exception in thread "main" java.lang.ClassCastException: Student cannot be cast
to java.lang.Comparable
而当只存入一个数据时不会报错,因为不需比较,
compareTo方法是存第二个元素开始才逐个调用的。
下面代码示例:
import java.util.*;
/*
* 往TreeSet存学生对象
* 按学生年龄顺序取出,学生名字作为次要顺序
* 同名同年龄视为同一个对象
*/
class TreeSetTest
{
public static void main(String[] a)
{
TreeSet v = new TreeSet(); //创建集合
v.add(new Student("a12",12)); //添加元素
v.add(new Student("c32",32));
v.add(new Student("h13",13));
v.add(new Student("t13",13));
v.add(new Student("h13",13));
Iterator t =v.iterator();
showSet(v);
}
public static void showSet(TreeSet s) //只是用来打印每个元素里的变量
{
Iterator t =s.iterator(); //迭代器
while(t.hasNext())
{
Student stu=(Student)t.next();
}
}
public static void sop(Object b)
{
System.out.println(b);
}
}
class Student implements Comparable
{
public int compareTo(Object b) throws RuntimeException
{
if(!(b instanceof Student))
throw new RuntimeException("不是学生对象");
Student s=(Student)b; //强制转换类型
if(this.age<s.age)return -1; //小于就返回负数
if(this.age==s.age)return this.name.compareTo(s.name);//年龄相同的判断名字
//字符串已经含compareTo方法,按自然顺序比
return 1;//大于就走这里返回正数
}
private String name;
private int age;
Student(String name,int age)
{
this.name=name;
this.age=age;
}
public String getName()
{
return name;
}
public int getAge()
{
return age;
}
}
输出结果:
a12...12
h13...13
t13...13
c32...32
而当TreeSet添加的元素是String类型的,即
v.add(
"hhgg"
);这
时会自动排序,因为String类型已经按自然顺序复写过compareTo方法。
另外,如果想让集合里元素的顺序与执行代码的顺序相同,可以这样复写compareTo:(其实没什么意义,且会重复元素)
public int compareTo(Object b)
{
return 1;//每次进来的元素都排在前一个元素的后面
}
输出结果:
a12...12
c32...32
h13...13
t13...13
h13...13