题解 | #成绩排序#
成绩排序
https://www.nowcoder.com/practice/8e400fd9905747e4acc2aeed7240978b
import java.io.BufferedReader; import java.io.IOException; import java.io.InputStreamReader; import java.util.Arrays; public class Main { public static void main(String[] args) { BufferedReader r = new BufferedReader(new InputStreamReader(System.in)); String[] students; String a; char[] chs; int[][] grades; int[] nameLen; int i = 0, l, n = 0, rules; try { a = r.readLine(); chs = a.toCharArray(); l = chs.length; while (i < l) { n *= 10; n += chs[i] - '0'; i++; } students = new String[n];//初始化学生信息数组 grades = new int[n][2];//初始化成绩数组 nameLen = new int[n];//初始化学生名字长度数组 a = r.readLine(); chs = a.toCharArray(); rules = chs[0] - '0';//获得排序方式 i = 0; while ((a = r.readLine()) != null && !a.isEmpty()) { students[i] = a;//学生信息包括名字和成绩放入成绩数组 grades[i][0] = i;//成绩数组第一列放入学生的编号, nameLen[i] = parseSutd(a, grades[i]);//名字长度数组中学生编号对应相应的名字长度 i++; } } catch (IOException e) { throw new RuntimeException(e); } //返回值大于0,交换位置 Arrays.sort(grades, (o1, o2) -> { if (rules == 1) return o1[1] - o2[1];//o1-o2>0,则相互交换位置,为1时是升序 else return o2[1] - o1[1];//为0时是降序 }); i = 0; a = ""; while (i < n) { a = a + students[grades[i][0]].substring(0, nameLen[grades[i][0]]) + " " + grades[i][1] + "\n"; i++; } System.out.print(a); } //HashMap+TreeMap,自定义comparator指定排序的值和规则 // private static int parseSutd(String str, int[] grades) { char[] chs = str.toCharArray(); int i = 0, j = 0, l = chs.length, n = 0; boolean grade = false; while (i < l) { if (chs[i] == ' ') { grade = true; i++; continue; } if (grade) { n *= 10; n += chs[i] - '0'; if (i == l - 1) grades[1] = n; i++; continue; } j++; i++; } return j; } }