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

(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<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,开始有这样一句话
(JAVA)用TreeSet集合存储学生类对象并按照年龄排序,代码及异常分析_第1张图片
这句话的意思是,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.程序运行结果

(JAVA)用TreeSet集合存储学生类对象并按照年龄排序,代码及异常分析_第2张图片
实现了要求的功能!

你可能感兴趣的:(Java)