成绩排名
输入多个学生的姓名和成绩, 打印其名称 成绩和排名
输入:
第一行: 整数N 表示有N个学生
第二行开始, 每行一个字符串和一个整数Mi, 表示学生姓名和成绩
输出:
(1<=N<=100, 0<=Mi<=100)
按成绩从高到低的顺序打印每个学生的姓名,成绩, 排名
(需要注意的是, 如果成绩相同, 则排名并列)
样例输入
6
张三 80
李四 90
王五 85
赵六 85
李雷 90
韩梅梅 100
样例输出:
韩梅梅 100 1
李雷 90 2
李四 90 2
王五 85 3
赵六 85 3
张三 80 4
方式一
//数组写法
public class Task12091 {
public static void main(String[] args) {
Scanner input = new Scanner(System.in);
System.out.println("输入学生的数量");
int num = input.nextInt();
//创建一个二维数组
String[][] student = new String[num][2];
//使用for循环添加数据
for(int i = 0; i < num; i++) {
System.out.println("输入学生的姓名");
student[i][0] = input.next();
System.out.println("输入学生的成绩");
student[i][1] = input.next();
}
Arrays.sort(student, new Comparator<Object>() {
@Override
public int compare(Object o1, Object o2) {
if(o1 instanceof String[] && o2 instanceof String[]) {
String[] s1 = (String[]) o1;
String[] s2 = (String[]) o2;
return -s1[1].compareTo(s2[1]);
}
throw new RuntimeException("输入的数据类型不一致");
}
});
//此时数组内容已经按照成绩顺序排好序,下面是排名的问题,同分同名次
//此时数组里第一个人成绩以及是最高的,我们需要比较的是后面的人的成绩和他是否想等
int randk = 0; //没有第0名
String lastScore = "-1"; //上一个人的成绩
for (int i = 0; i < student.length; i++) {
if(!(student[i][1].equals(lastScore))){
lastScore = student[i][1];
randk++;
}
System.out.println("姓名:" + student[i][0] + " 成绩" + student[i][1] + " 排名:" + randk);
}
}
}
运行结果
方式二
public class Task1209 {
public static void main(String[] args) {
Scanner input = new Scanner(System.in);
System.out.println("请输入学生的数量");
int n = input.nextInt(); //存储学生数量
int rank = 0; //存储排名
int lastScore = -1; //存储上一个学生的成绩
List<Student> list = new ArrayList<Student>();
for(int i = 0; i < n; i++) {
Student s = new Student();
System.out.println("请输入学生的姓名");
s.setName(input.next());
System.out.println("请输入学生的成绩");
s.setScore(input.nextInt());
list.add(s);
}
Collections.sort(list, new Comparator<Student>() {
@Override
public int compare(Student o1, Student o2) {
return o2.getScore() - o1.getScore();
}
});;
for (int i = 0; i < list.size(); i++) {
if((list.get(i).getScore() - lastScore) != 0) {
lastScore = list.get(i).getScore();
rank++;
}
System.out.println("姓名:" + list.get(i).getName() + "成绩:" + list.get(i).getScore() +
"名次" + rank);
}
}
}
public class Student {
private String name;
private int score;
public Student() {
}
public String getName() {
return name;
}
public int getScore() {
return score;
}
public void setName(String name) {
this.name = name;
}
public void setScore(int score) {
this.score = score;
}
@Override
public String toString() {
return name + " " + score + " ";
}
}
方式三
public class Task1209 {
public static void main(String[] args) {
Scanner input = new Scanner(System.in);
System.out.println("请输入学生的数量");
int n = input.nextInt(); //存储学生数量
int rank = 0; //存储排名
int lastScore = -1; //存储上一个学生的成绩
List<Student> list = new ArrayList<Student>();
for(int i = 0; i < n; i++) {
Student s = new Student();
System.out.println("请输入学生的姓名");
s.setName(input.next());
System.out.println("请输入学生的成绩");
s.setScore(input.nextInt());
list.add(s);
}
Collections.sort(list);
for (int i = 0; i < list.size(); i++) {
if((list.get(i).getScore() - lastScore) != 0) {
lastScore = list.get(i).getScore();
rank++;
}
System.out.println("姓名:" + list.get(i).getName() + "成绩:" + list.get(i).getScore() +
"名次" + rank);
}
}
}
public class Student implements Comparable<Student>{
private String name;
private int score;
public Student() {
}
public String getName() {
return name;
}
public int getScore() {
return score;
}
public void setName(String name) {
this.name = name;
}
public void setScore(int score) {
this.score = score;
}
@Override
public String toString() {
return name + " " + score + " ";
}
@Override
public int compareTo(Student o) {
// TODO 自动生成的方法存根
return o.getScore() - this.getScore();
}
}