写的有些乱,当提供一种思路,整体还有优化的地方。
import java.util.*; // 注意类名必须为 Main, 不要有任何 package xxx 信息 public class Main { public static void main(String[] args) { Scanner in = new Scanner(System.in); // 注意 hasNext 和 hasNextLine 的区别 int max = in.nextInt(); int sort = in.nextInt(); // 存储名称与成绩集合 List<String> names = new ArrayList<>(); List<Integer> grades = new ArrayList<>(); for (int i = 0; i < max; i++) { String name = in.next(); int grade = in.nextInt(); if (i == 0) { // 第一组数据直接添加进集合 names.add(name); grades.add(grade); } else { // 其他组数据判断插入 sortList(names, grades, name, grade, sort); } } // 根据排序类型输出不同数据 if (sort == 1) { for (int i = 0; i < grades.size(); i++) { System.out.println(names.get(i) + " " + grades.get(i)); } } else { for (int i = grades.size() - 1; i >= 0; i--) { System.out.println(names.get(i) + " " + grades.get(i)); } } } /** * 判断插入 * @param names 名称集合 * @param grades 成绩集合 * @param name 当前输入名称 * @param grade 当前输入成绩 * @param sort 排序类型 */ private static void sortList(List<String> names, List<Integer> grades, String name, int grade, int sort) { int l = 0, r = grades.size(), num = 0; while (l <= r) { num = (r + l) / 2; // 判断中位值是否小于当前输入成绩 if (grades.get(num) < grade) { // 中位值等于集合最大值时直接添加 if (num == grades.size() - 1) { names.add(name); grades.add(grade); return; } // 中位值后一位大于当前输入成绩时进行插入 if (grades.get(num + 1) > grade) { names.add(num + 1, name); grades.add(num + 1, grade); return; } // 修改左标位置 l = num; } // 判断中位值是否大于当前输入成绩 if (grades.get(num) > grade) { // 中位值等于0时插入值到下标0 if (num == 0) { names.add(0, name); grades.add(0, grade); return; } // 中位值前一位小于当前输入成绩时进行插入 if (grades.get(num - 1) < grade) { names.add(num, name); grades.add(num, grade); return; } // 修改右标位置 r = num; } // 判断中位值是否等于当前输入成绩 if (grades.get(num) == grade) { // 集合中相等值可能会出现多个,根据不同排序方式,插入位置不同 // 升序时 if (sort == 1) { int count = 1; while (true) { if (num + count <= grades.size() - 1 && grades.get(num + count) == grade) count++; else { num = num + count - 1; break; } } names.add(num + 1, name); grades.add(num + 1, grade); } // 降序时 if (sort == 0) { int count = 1; while (true) { if (num - count >= 0 && grades.get(num - count) == grade) count++; else { num = num - count + 1; break; } } names.add(num, name); grades.add(num, grade); } return; } } } }