赞
踩
在向数据结构如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当前对象较小
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。