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<Stu> treeSet = new TreeSet<Stu>();
//创建学生对象
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<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;
}
@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<Stu> treeSet = new TreeSet<Stu>();
//创建学生对象
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.程序运行结果
实现了要求的功能!