(JAVA)用TreeSet集合存储学生类对象并按照年龄排序,代码及异常分析

您所在的位置:网站首页 bts成员年龄大小排序 (JAVA)用TreeSet集合存储学生类对象并按照年龄排序,代码及异常分析

(JAVA)用TreeSet集合存储学生类对象并按照年龄排序,代码及异常分析

2023-12-12 19:59| 来源: 网络整理| 查看: 265

(JAVA)用TreeSet集合存储学生类对象并按照年龄排序,代码及异常分析 1.题目要求2.代码一3.异常4.代码修改后5.程序运行结果

1.题目要求

1.用TreeSet存储学生对象,并遍历,创建集合使用无参构造; 2.按照年龄从小到大排序,年龄相同时,按照姓名的字母排序 。

2.代码一

我们先尝试实现遍历功能,假设写出下列代码: (1)构造学生类

//创建学生类 public class Stu { private String name; private int age; public Stu() { } public Stu(String name, int age) { this.name = name; this.age = age; } public String getName() { return name; } public void setName(String name) { this.name = name; } public int getAge() { return age; } public void setAge(int age) { this.age = age; } }

(2)创建TreeSet集合,尝试存储、遍历:

public class TreeSetDemo2 { public static void main(String[] args) { //创建集合对象 TreeSet treeSet = new TreeSet(); //创建学生对象 Stu s1 = new Stu("ZhangSan",18); Stu s2 = new Stu("LiSi",19); Stu s3 = new Stu("WangWu",20); treeSet.add(s1); treeSet.add(s2); treeSet.add(s3); //增强for遍历 for(Stu s:treeSet){ System.out.println(s.getName()+" , "+s.getAge()); } } } 3.异常

运行后发现程序有如下异常:

Exception in thread “main” java.lang.ClassCastException: class TreeSet.Stu cannot be cast to class java.lang.Comparable (TreeSet.Stu is in unnamed module of loader ‘app’; java.lang.Comparable is in module java.base of loader ‘bootstrap’) at java.base/java.util.TreeMap.compare(TreeMap.java:1291) at java.base/java.util.TreeMap.put(TreeMap.java:536) at java.base/java.util.TreeSet.add(TreeSet.java:255) at TreeSet.TreeSetDemo2.main(TreeSetDemo2.java:17)

这里的异常是ClassCastException,原因是class TreeSet.Stu cannot be cast to class java.lang.Comparable,去帮助文档中查询Comparable,开始有这样一句话 在这里插入图片描述 这句话的意思是,TreeSet中所装的对象必须实现了Comparable接口,不然就会报错。所以我们将Stu实现该接口并重写compareTo方法。

4.代码修改后

修改后Stu如下:

public class Stu implements Comparable { private String name; private int age; public Stu() { } public Stu(String name, int age) { this.name = name; this.age = age; } public String getName() { return name; } public void setName(String name) { this.name = name; } public int getAge() { return age; } public void setAge(int age) { this.age = age; } @Override public int compareTo(Stu s) { int num = this.age - s.age; //本次输入的年龄与上次的年龄之差 int num2 = num == 0 ? this.name.compareTo(s.name) : num; // 若num为0,则意味着年龄相同,那么就要比较姓名的首字母; //若num不为0,则num2等于num,返回的就是年龄差,若为正就是从小到大排序。 return num2; } }

测试主程序也稍作修改,如下所示:

/*要求: 1.用TreeSet存储学生对象,并遍历,创建集合使用无参构造 2.按照年龄从小到大排序,年龄相同时,按照姓名的字母排序 */ public class TreeSetDemo2 { public static void main(String[] args) { //创建集合对象 TreeSet treeSet = new TreeSet(); //创建学生对象 Stu s1 = new Stu("ZhangSan",18); Stu s2 = new Stu("LiSi",19); Stu s3 = new Stu("WangWu",20); Stu s4 = new Stu("ZhaoLiu",18); treeSet.add(s1); treeSet.add(s2); treeSet.add(s3); treeSet.add(s4); //增强for遍历 for(Stu s:treeSet){ System.out.println(s.getName()+" , "+s.getAge()); } } } 5.程序运行结果

在这里插入图片描述 实现了要求的功能!



【本文地址】


今日新闻


推荐新闻


CopyRight 2018-2019 办公设备维修网 版权所有 豫ICP备15022753号-3