在向数据结构如TreeSet中插入自定义的对象时,如以下代码:
public class demo {
public static void main(String[] args) {
TreeSet<Person> data = new TreeSet<>();
Person person1 = new Person("Edmond",17);
Person person2 = new Person("John",19);
data.add(person1);
data.add(person2);
for(Person p : data){
System.out.println(p);
}
}
static class Person{
private String name;
private int age;
public Person(String name, int age) {
this.name = name;
this.age = age;
}
}
}
系统将会在第一次add时便进行报错:
原因在于当我们将数据存入TreeSet时,内部会自动进行排序,例如我们存入‘A‘,’C’, ‘B’, 打印输出时将显示’A’, ‘B’, ‘C’。因此如果我们存入的数据类型为自定义类型时,系统将不知道如何进行排序。
因此我们需要implement Comparable接口,并自己定义比较规则,示范代码如下:
public class demo {
public static void main(String[] args) {
TreeSet<Person> data = new TreeSet<>();
Person person1 = new Person("Edmond",17);
Person person2 = new Person("John",19);
Person person3 = new Person("Tom",9);
data.add(person1);
data.add(person2);
data.add(person3);
for(Person p : data){
System.out.println(p);
}
}
static class Person implements Comparable<Person>{
private String name;
private int age;
public Person(String name, int age) {
this.name = name;
this.age = age;
}
@Override
public int compareTo(Person o) {
//this当前对象 与 o 比较
//返回数据有三种类型:
//整数 : 代表this当前对象较大
//0 : 代表一样大
//负数 : 代表this当前对象较小
if(this.age > o.age){
return 1;
}else if(this.age == o.age){
return 0;
}
return -1;
//可以简写为return this.age - o.age;
}
@Override
public String toString() {
return "Person{" +
"name='" + name + '\'' +
", age=" + age +
'}';
}
}
}
无报错,输出为:
总结
当遇到ClassCastException:: cannot be cast to class java.lang.Comparable,自定义的class需要implement Comparable接口,并根据需求重写compareTo方法,
其中compareTo方法返回值有三种:
//整数 : 代表this当前对象较大
//0 : 代表一样大
//负数 : 代表this当前对象较小