写的有些乱,当提供一种思路,整体还有优化的地方。
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;
}
}
}
}

京公网安备 11010502036488号