第一行输入一个整数
代表学生人数。
第二行输入一个整数
代表排序方式,其中,
表示按成绩降序,
表示按成绩升序。
此后
行,第
行依次输入:
一个长度为
、由大小写字母构成的字符串
代表第
个学生的姓名;
一个整数
代表这个学生的成绩。
根据输入的排序方式,按照成绩升序或降序输出所有学生的姓名和成绩。对于每一名学生,新起一行。输出学生的姓名和成绩,用空格分隔。
3 0 fang 90 yang 50 ning 70
fang 90 ning 70 yang 50
在这个样例中,
,因此按成绩降序排序。
4 1 fang 90 yang 50 ning 70 yang 70
yang 50 ning 70 yang 70 fang 90
在这个样例中,
,因此按成绩升序排序。
本题已于下方时间节点更新,请注意题解时效性:
1. 2025-05-16 更新题面。
2. 2025-01-09 更新题面。
import java.util.*; import java.util.stream.*; // 注意类名必须为 Main, 不要有任何 package xxx 信息 public class Main { public static void main(String[] args) { Scanner in = new Scanner(System.in); // 注意 hasNext 和 hasNextLine 的区别 while (in.hasNext()) { // 注意 while 处理多个 case int num = Integer.valueOf(in.nextLine()); int sort = Integer.valueOf(in.nextLine()); List<Student> list = new ArrayList<>(); while(num>0){ String[] inputs = in.nextLine().split(" "); list.add(new Student(inputs[0],Integer.valueOf(inputs[1]))); num--; } list = list.stream().sorted((a,b)->{ if(sort == 0 ){ return b.score-a.score; } else { return a.score-b.score; } }).collect(Collectors.toList()); list.forEach(o -> System.out.println(o.name+" "+o.score)); } } static class Student{ String name; int score; public Student(String name,int score){ this.name= name; this.score=score; } } }
一、容易想到的方法,封装对象。
public class Main { public static void main(String[] args) { Scanner in = new Scanner(System.in); // 注意 hasNext 和 hasNextLine 的区别 int total = in.nextInt(); int order = in.nextInt(); List<Stu> list = new ArrayList<>(); for (int i = 0; i < total; i++) { String name = in.next(); int score = in.nextInt(); Stu stu = new Stu(name, score); list.add(stu); } if (order == 0) { // 0 降序 Collections.sort(list, Comparator.reverseOrder()); } else if (order == 1) { // 1 升序 Collections.sort(list); } list.forEach(stu -> System.out.println(stu.getName() + " " + stu.getScore())); } private static class Stu implements Comparable<Stu> { private String name; private int score; Stu(String name, int score) { this.name = name; this.score = score; } int getScore() { return this.score; } String getName() { return this.name; } public int compareTo(Stu o) { if (o == null) { return 1; } return this.getScore() - o.getScore(); } } }
二、其实List嵌套List也可以被排序
public class Main { public static void main(String[] args) { Scanner in = new Scanner(System.in); // 注意 hasNext 和 hasNextLine 的区别 int total = in.nextInt(); int order = in.nextInt(); List<List> list = new ArrayList<>(); for (int i = 0; i < total; i++) { String name = in.next(); int score = in.nextInt(); List l = new ArrayList<>(); l.add(name); l.add(score); list.add(l); } if (order == 0) { // 0 降序 Collections.sort(list, (o1, o2) -> (int) o2.get(1) - (int) o1.get(1)); } else if (order == 1) { // 1 升序 Collections.sort(list, (o1, o2) -> (int) o1.get(1) - (int) o2.get(1)); } list.forEach(l -> System.out.println(l.get(0) + " " + l.get(1))); } }
public static void main(String[] args) { Scanner sc = new Scanner(System.in); int n = sc.nextInt(); int op = sc.nextInt(); String [][]arr = new String[n][3]; for (int i = 0; i < n; i++) { String s = sc.next(); String age = sc.next(); arr[i] = new String[] {s, age, "" + i}; } Arrays.sort(arr, new Comparator<String[]>() { @Override public int compare(String[] o1, String[] o2) { int r = Integer.parseInt(o1[1]) - Integer.parseInt(o2[1]); if(r==0){ // 如果成绩相同就按照原始输入顺序排序 return Integer.parseInt(o1[2]) - Integer.parseInt(o2[2]); } else { // 注意op==0时要倒序排序 return op==0? -r : r; } } }); for (String[] s : arr) { System.out.println(s[0] + " " + s[1]); } }
import java.util.*; public class Main { public static void main(String[] args) { Scanner in = new Scanner(System.in); int n = in.nextInt(); int op = in.nextInt(); List<KV> list = new ArrayList<>(); while (n-- > 0) { list.add(new KV(in.next(),in.nextInt())); // 存入list } list.sort((o1,o2)->{ return op == 1 ? o1.getValue().compareTo(o2.getValue()) : o2.getValue().compareTo(o1.getValue());}); // 排序 list.forEach(e-> {System.out.println(e.getKey() + " " + e.getValue());}); // 打印 } } // 包装(名字,成绩) class KV { private String key; private Integer value; public KV(String key, Integer value) { this.key = key; this.value = value; } public String getKey() { return this.key; } public Integer getValue() { return this.value; } }
import java.util.*; // 注意类名必须为 Main, 不要有任何 package xxx 信息 public class Main { public static void main(String[] args) { Scanner in = new Scanner(System.in); // 读取学生人数 int n = in.nextInt(); // 读取排序方式 int sortType = in.nextInt(); // 创建学生数组 String[] names = new String[n]; int[] scores = new int[n]; // 读取学生信息 for (int i = 0; i < n; i++) { names[i] = in.next(); scores[i] = in.nextInt(); } // 两层循环实现冒泡排序 for (int i = 0; i < n - 1; i++) { for (int j = 0; j < n - 1 - i; j++) { if ((sortType == 0 && scores[j] < scores[j + 1]) || (sortType == 1 && scores[j] > scores[j + 1])) { // 交换成绩 int tempScore = scores[j]; scores[j] = scores[j + 1]; scores[j + 1] = tempScore; // 交换名字 String tempName = names[j]; names[j] = names[j + 1]; names[j + 1] = tempName; } } } // 输出排序后的学生信息 for (int i = 0; i < n; i++) { System.out.println(names[i] + " " + scores[i]); } in.close(); } }
// 算法复杂度O(nlogn)空间复杂度o(n); import java.io.BufferedReader; import java.io.IOException; import java.io.InputStreamReader; import java.util.*; public class Main { public static void main(String[] args) throws IOException { BufferedReader br = new BufferedReader(new InputStreamReader(System.in)); int n = Integer.parseInt(br.readLine()); int flag = Integer.parseInt(br.readLine()); Map<Integer, List<String>> map = new HashMap<>(); String str; while ((str = br.readLine()) != null && !str.isEmpty()) { String[] strs = str.split(" "); int key = Integer.parseInt(strs[1]); List<String> names = map.getOrDefault(key, new ArrayList<>()); names.add(strs[0]); map.put(key, names); } int[] nums = new int[map.size()]; int index = 0; for (int key : map.keySet()) { nums[index++] = key; } Arrays.sort(nums); if (flag == 1) { // 升序输出 for (int i : nums) { for (String name : map.get(i)) { System.out.println(name + " " + i); } } } else { for (int i = nums.length - 1; i >= 0; i--) { int key = nums[i]; for (String name : map.get(key)) { System.out.println(name + " " + key); } } } } }
import java.util.Scanner; import java.util.Map; import java.util.TreeMap; import java.util.List; import java.util.ArrayList; import java.util.Comparator; // 注意类名必须为 Main, 不要有任何 package xxx 信息 public class Main { public static void main(String[] args) { Scanner in = new Scanner(System.in); // 注意 hasNext 和 hasNextLine 的区别 while (in.hasNextInt()) { // 注意 while 处理多个 case int n = in.nextInt(); int sort = in.nextInt(); Comparator<Integer> comparator = sort == 0 ? (x, y) -> y - x : Integer::compareTo; Map<Integer, List<String>> map = new TreeMap<>(comparator); for (int i = 0; i < n; i++) { String name = in.next(); int score = in.nextInt(); map.computeIfAbsent(score, k -> new ArrayList<String>()).add(name); } map.forEach((k,v) -> { for (String s : v) { System.out.println(s + " " + k); } }); } } }
思路:利用桶排序
import java.util.HashMap; import java.util.Map; import java.util.Scanner; public class Main { public static void main(String[] args) { Scanner in = new Scanner(System.in); int sum = in.nextInt(); int sort = in.nextInt(); //数组的角标即为成绩,利用桶排序 Student[] stu = new Student[101]; for (int i = 0; i < sum; i++) { String name = in.next(); int score = in.nextInt(); //每个类记录相同分数的所有名字 if (stu[score] == null) { stu[score] = new Student(name); } else { stu[score].addName(name); } } //从小到大,正序输出student数组 if (sort == 1) { for (int i = 0; i <= 100; i++) { if (stu[i] != null) { //遍历每个类内部所有的名字 for (int j = 0; j < stu[i].point; j++) { System.out.println(stu[i].name[j] + " " + i); } } } //从大到小,倒序输出 } else { for (int i = 100; i >= 0; i--) { if (stu[i] != null) { for (int j = 0; j < stu[i].point; j++) { System.out.println(stu[i].name[j] + " " + i); } } } } } } //对每个分数建立名字列表,以保证相同成绩时,保持输入的顺序 class Student { String[] name = new String[200]; //每个类内部维护记录名字的数组 int point = 0; public Student(String name) { this.name[point++] = name; } public void addName(String name) { this.name[point++] = name; } }
import java.util.Arrays; import java.util.Scanner; public class Main { public static void main(String[] args) { Scanner in = new Scanner(System.in); int n = Integer.parseInt(in.nextLine()); Student.sortMethod = Integer.parseInt(in.nextLine()); Student[] students = new Student[n]; for (int i = 0; i < n; i++) { String[] s = in.nextLine().split(" "); students[i] = new Student(i, s[0], Integer.parseInt(s[1])); } Arrays.sort(students); for (Student student : students) { System.out.println(student.name + " " + student.score); } } } class Student implements Comparable<Student> { int i; String name; int score; public static int sortMethod; public Student(int i, String name, int score) { this.i = i; this.name = name; this.score = score; } @Override public int compareTo(Student o) { int s = Integer.compare(this.score, o.score); if (sortMethod == 0) { s = -s; } if (s != 0) { return s; } return Integer.compare(this.i, o.i); } }是很难看,但是过了啊(