集合与接口_学生排序

问题描述

请创建学生类(Student),用于存储学生信息。创建ArrayList集合,依次存储如下5位同学的信息,并使用ComparableComparator接口对5位同学的成绩做降序排序,如果成绩一样,那在成绩排序的基础上按照年龄由小到大排序。最后遍历并输出ArrayList集合中的数据。

姓名(String)

年龄(int)

分数(double)

张三

20

90.0‍

李四

22

90.0

王五

20

99.0

孙六

22

100.0

赵七

20

100.0‍

输出结果如下:

Student [name=赵七, age=20, score=100.0]
Student [name=孙六, age=22, score=100.0]
Student [name=王五, age=20, score=99.0]
Student [name=张三, age=20, score=90.0]
Student [name=李四, age=22, score=90.0]

参考思路

1

首先定义学生类,根据表格,学生类有3个字段,姓名、年龄、分数。请注意,字段在不同教材的称呼可能不同!(字段=属性=成员变量)

为了便于初始化字段,定义一个带参数的构造器。(构造器=构造方法)

为了便于打印学生信息,可以覆盖toString()方法。

public class Student {

    // private表示本类可以访问,可以换成其它的,不写的话是本包可以访问
    private String name;
    private int age;
    private double score;

    public Student(String name, int age, int score) {
        this.name = name;
        this.age = age;
        this.score = score;
    }

//    public String toString() {
//        // 自己写相对麻烦
//    }

    @Override
    public String toString() {
        return "Student{" +
                "name='" + name + '\'' +
                ", age=" + age +
                ", score=" + score +
                '}';
    }
}

当完成上述步骤,先在main方法中测试一下。

public class Main {
    // Main类仅用于放main方法, main方法是程序的入口,程序从这里开始执行

    // Main也可以改成其它名字

    public static void main(String[] args) { // main方法

        Student student = new Student("张三", 20, 90);
        // 这里会调用刚定义的构造器,见Student.java
        // 参数,即姓名 年龄 成绩需要 一 一 对应!

        System.out.println(student);
        // => Student{name='张三', age=20, score=90.0}
    }
}

2

创建ArrayList存储5位同学的信息。

import java.util.ArrayList; // 请尝试手动导入

public class Main {
    public static void main(String[] args) { // main方法
        /*
        ArrayList是一个有类型参数的 泛型类,为了指定数组列表保存的元素类型
        需要用一对尖括号将类名括起来追加到ArrayList的后面,例如ArrayList<Student>
         */
        ArrayList<Student> students = new ArrayList<>();

        // 使用 add 方法可以将元素添加到数组列表中

        // 根据表格创建学生对象之后 , 直接添加到数组列表中
        students.add(new Student("张三", 20, 90));
        students.add(new Student("李四", 22, 90));
        students.add(new Student("王五", 20, 99));
        students.add(new Student("孙六", 22, 100));
        students.add(new Student("赵七", 20, 100));

        // 此时已经可以用foreach循环依次打印学生信息,不过是无序的
        for (Student student : students) {
            System.out.println(student);
        }
    }
}

输出结果:

Student{name='张三', age=20, score=90.0}
Student{name='李四', age=22, score=90.0}
Student{name='王五', age=20, score=99.0}
Student{name='孙六', age=22, score=100.0}
Student{name='赵七', age=20, score=100.0}

3

如何实现对Student的排序?有一个现成的Java类库中的方法可以使用,叫作Collections.sort,可以实现对数组列表的排序。

但是使用该方法存在一些前提:

一,通过import导入java.util.Collections

但此时,如果调用Collections.sort(students);并不能实现排序,因为排序的前提是,首先知道怎样比较两个元素的大小,Collections.sort 并不知道怎样去比较两个Student的大小。此时如果调用上面方法将报错:java: 对于sort(java.util.ArrayList<Student>), 找不到合适的方法

二,还需实现一个接口。可参考集合课件(List集合类_演练)。

最终代码:

public class Student implements Comparable<Student> {

    private String name;
    private int age;
    private double score;

    public Student(String name, int age, int score) {
        this.name = name;
        this.age = age;
        this.score = score;
    }

    @Override
    public String toString() {
        return "tmp.Student{" +
                "name='" + name + '\'' +
                ", age=" + age +
                ", score=" + score +
                '}';
    }

    @Override
    public int compareTo(Student o) {
        int result = (int) (o.score - this.score);
        if (result == 0) {
            result = this.age - o.age;
        }
        return result;
    }
}

Main类

import java.util.ArrayList;
import java.util.Collections;
import java.util.List;

public class Main {
    public static void main(String[] args) {

        List<Student> students = new ArrayList<>();

        students.add(new Student("张三", 20, 90));
        students.add(new Student("李四", 22, 90));
        students.add(new Student("王五", 20, 99));
        students.add(new Student("孙六", 22, 100));
        students.add(new Student("赵七", 20, 100));

        Collections.sort(students);

        for (Student student : students) {
            System.out.println(student);
        }
    }
}

输出结果:

Student{name='赵七', age=20, score=100.0}
Student{name='孙六', age=22, score=100.0}
Student{name='王五', age=20, score=99.0}
Student{name='张三', age=20, score=90.0}
Student{name='李四', age=22, score=90.0}

 

posted @ 2024-11-29 11:31  xkfx  阅读(111)  评论(0编辑  收藏  举报