使用TreeSet集合存储学生对象使用无参构造方法时,出现关于Comparable的报错。
package Comparable_Demo;public class Student {private int age;private String name;public Student() {}public Student(int age,String name) {this.name = name;this.age = age;}public int getAge() {return age;}public void setAge(int age) {this.age = age;}public String getName() {return name;}public void setName(String name) {this.name = name;}@Overridepublic String toString() {return "Student [age=" + age + ", name=" + name ;}}
package Comparable_Demo;import java.util.TreeSet;//用TreeSet集合存储自定义对象,并遍历
//要求:年龄按从小到大的顺序,名字按字母顺序排序
public class Test {public static void main(String[] args) {// TODO Auto-generated method stub//创建集合对象,使用无参方法TreeSet<Student> ts = new TreeSet<Student>();//创建学生对象Student s = new Student(18,"纤维素");Student s1 = new Student(19,"响尾蛇");Student s2 = new Student(20,"新闻社");//添加元素ts.add(s);ts.add(s1);ts.add(s2);//for增强循环for(Student ss : ts) {System.out.println(ss);}}}
报错:Comparable_Demo.Student cannot be cast to java.lang.Comparable
原因:
- 使用TreeSet集合存储自定义对象,无参构造方法是通过自然排序对元素进行排序的。
- 自然排序就是让元素所属的类实现Comparable接口,重写compareTo(To)方法;
解决办法:
- Student类Comparable接口;
- 重写compareTo(To)方法
最后代码如下:
public class Student implements Comparable<Student>{private int age;private String name;public Student() {}public Student(int age,String name) {this.name = name;this.age = age;}public int getAge() {return age;}public void setAge(int age) {this.age = age;}public String getName() {return name;}public void setName(String name) {this.name = name;}@Overridepublic String toString() {return "Student [age=" + age + ", name=" + name ;}@Overridepublic int compareTo(Student s) {// TODO Auto-generated method stubint num = this.age-s.age;//升序int num1 = num == 0 ? this.name.compareTo(s.name):num;return num;}
}