在向資料結構如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當前物件較小
轉載請註明出處,本文鏈接:https://www.uj5u.com/houduan/267073.html
標籤:java
