因为TreeSet的二叉树结构,所以他接收的元素必须要有比较性,下面是我学习时总结的,你可以详细看下
TreeSet存储自定义对象
|-- 示例:往TreeSet集合中存储自定义对象学生,按照学生的年龄进行排序。
|-- 问题:当存储第二个元素时出现异常,因为TreeSet集合存储元素时需要按照一定顺序。
|-- 解决方法1:让元素自身具备比较性,让学生类实现Comparable接口,覆盖compareTo方法。
|-- 解决方法2:让Treeset集合具备比较性,定义Comparator比较器,将比较器对象作为参数传递给TreeSet集合的构造函数。
|-- 比较器如何定义:定义一个类,实现Comparator接口,覆盖compare方法。
|-- 区别:当两种方法都存在时,以比较器为主。比较器较常用些。
方法1:
class Student implements Comparable//该接口强制让学生具备比较性
{
private String name;
private int age;
Student(String name,int age)
{
this.name = name;
this.age = age;
}
public int compareTo(Object obj)
{
if(!(obj instanceof Student))
throw new RuntimeException("不是学生对象");
Student s = (Student)obj;
if(this.age > s.age)
return 1;
if(this.age == s.age)
{
this.name.compareTo(s.name);
}
return -1;
}
}
方法2:
Treeset ts = newTreeSet(new MyCompare());
class MyCompare implements Comparator
{
public int compare(Object o1,Object o2)
{
Student s1 = (Student)o1;
Student s2 = (Student)o2;
int num = s1.getName().compareTo(s2.getName());
if (num == 0)
{
//return s1.getAge() - s2.getAge();
return new Integer(s1.getAge()).compareTo(new Integer(s2.getAge()));
}
return num;
}
} |