读入 n(>0)名学生的姓名、学号、成绩,分别输出成绩最高和成绩最低学生的姓名和学号。
输入格式:
每个测试输入包含 1 个测试用例,格式为
第 1 行:正整数 n
第 2 行:第 1 个学生的姓名 学号 成绩
第 3 行:第 2 个学生的姓名 学号 成绩
... ... ...
第 n+1 行:第 n 个学生的姓名 学号 成绩
其中姓名
和学号
均为不超过 10 个字符的字符串,成绩为 0 到 100 之间的一个整数,这里保证在一组测试用例中没有两个学生的成绩是相同的。
输出格式:
对每个测试用例输出 2 行,第 1 行是成绩最高学生的姓名和学号,第 2 行是成绩最低学生的姓名和学号,字符串间有 1 空格。
输入样例:
3
Joe Math990112 89
Mike CS991301 100
Mary EE990830 95
输出样例:
Mike CS991301
Joe Math990112
运行代码:
package com.huanhuan;
import java.util.ArrayList;
import java.util.Collections;
import java.util.Scanner;
class Student implements Comparable<Student>{
//定义私有属性
private String name;
private String stuId;
private int grade;
//构造方法
public Student(String name, String stuId, int grade) {
this.name = name;
this.stuId = stuId;
this.grade = grade;
}
//若要调用集合类中的排序函数sort(),需要先实现Comparable接口里的compareTo函数,
@Override
public int compareTo(Student o) {
return (this.grade - o.grade);
}
@Override
public String toString() {
return name + " " + stuId;
}
}
public class Test3 {
public static void main(String[] args) {
Scanner sc = new Scanner(System.in);//输入
int n = sc.nextInt();//输入正整数n nextInt()看到空格符或回车符都认为读取结束,此时不会读取回车符。
/*nextLine()读取空格,直到以'\n'为标志的行尾。以回车符为结束,并且只是以回车符结束,并且会读取回车符。
一旦输入读取完毕,该方法会将光标移到下一行开始的位置。*/
sc.nextLine();
ArrayList<Student> students = new ArrayList<Student>();
for (int i = 0; i < n; i++) {
//split():把字符串按照指定的分割符进行分割,然后返回字符串数组
String[] lineSplit = sc.nextLine().split(" ");
students.add(new Student(lineSplit[0],lineSplit[1],Integer.parseInt(lineSplit[2])));
}
Collections.sort(students);//调用集合类的静态排序函数,默认升序
System.out.println(students.get(n-1));//第十名成绩最好,但下标为9
System.out.println(students.get(0));//第一个学生成绩最差,下标为0
}
}
知识点:用Collections.sort方法对list排序有两种方法
(1)list中的对象实现Comparable接口,如上面代码就在Student类中实现Comparable接口;
(2)根据Collections.sort重载方法来实现,以上面代码为例,即不用在Student类中实现Comparable接口。