集合与接口_学生排序
问题描述
请创建学生类(Student
),用于存储学生信息。创建ArrayList
集合,依次存储如下5位同学的信息,并使用Comparable
或Comparator
接口对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}