1、产生问题的原因:
TreeSet的特点是可排序、不重复,即TreeSet要求存放的对象必须是可排序的。如果对象之间不可排序,就会抛出这个异常。
2、解决方法:
方法1:实现Comparable接口
class Person implements Comparable<Person> {
String name;
int age;
@Override
public int comparaTo(Person p) {
int cmp = age - p.age;
return cmp != 0 ? cmp : name.compareTo(p.name);
}
@Override
public String toString() {
return "{" +
"name='" + name + '\'' +
", age=" + age +
'}';
}
}
public class Test {
public static void main(String[] args) {
TreeSet<Person> set = new TreeSet<>();
set.add(new Person("Lisa", 24));
set.add(new Person("Mark", 25));
System.out.println(set);
}
}
方法2:实现Comparator类来新建一个比较器
class Person {
String name;
int age;
@Override
public String toString() {
return "{" +
"name='" + name + '\'' +
", age=" + age +
'}';
}
}
public class Test {
public static void main(String[] args) {
// 在创建TreeSet对象是传入一个Comparator比较器
TreeSet<Person> set = new TreeSet<>(new Comparator<Person>() {
@Override
public int compare(Person o1, Person o2) {
return o1.getScore() - o2.getScore();
}
});
set.add(new Person("Lisa", 24));
set.add(new Person("Mark", 25));
System.out.println(set);
}
}
3、使用treeSet需要注意的地方:
-
使用treeSet在排序的时候是在添加的时候进行排序的,如果在添加之后修改数据不会影响前面的排序
-
在使用treeSet的时候,如果是在添加数据之后修改数据的值,可能会出现一样的数据
-
为了避免这种情况的发生,可以将对象的属性用final修饰