问题

输入学生成绩,并按输入顺序编号,再按成绩进行降序排序,输出前10名的学生成绩,如果学生人数不足十人则只输出仅有的学生成绩。
例如 输入20 30 40 50 70 -1(结束),输出:X号,XX分

注意: 今天看到了原题目,此题目并未假设输入学生成绩互不相等
而原题目中假设了输入的学生成绩互不相等!!!

原题目如下:
输入一组互不相等的百分制成绩(个数<=100),以-1结束,按由高到低的顺序输出前10名的位置号。位置号根据输入的顺序确定,第n个输入的成绩的位置号为n(n为自然数)。输出格式为X号X分。注意输入不足10个时,按照实际的输入个数输出。例如:输入66 88 77 -1,则输出2号88分 3号77分 1号66分。

分析

原题目中的“互不相等的百分制成绩”使用map会很容易

Java实现

static class Student{
int num;
float score;
Student(Integer num,float score){
this.num = num;
this.score = score;
}
}

public static void test05(){
Scanner sc = new Scanner(System.in);
List<Student> list = new ArrayList<>();
int n = 1;
while (true){
float score = sc.nextFloat();
if (score == -1) break;
list.add(new Student(n++,score));
}
int length = list.size();
while (true){
for (int i = 0; i < length-1; i++) {
if (list.get(i).score < list.get(i+1).score){
Student swap = list.get(i);
list.set(i,list.get(i+1));
list.set(i+1,swap);
}
}
length--;
if (length == 0) break;
}
Iterator<Student> it = list.iterator();
while (it.hasNext()){
if (length > 9) break;
Student student = it.next();
System.out.println(student.num+"号 "+student.score+"分");
length++;
}
}

原题目

public static void test04(){
Scanner sc = new Scanner(System.in);
Map<Float, Integer> map = new HashMap<>();
int k = 0;
float[] stu = new float[100];
while (true){
float n = sc.nextFloat();
if (n == -1) break;
stu[k++] = n;
map.put(n,k);
}
while (k > 0){
for (int i = k; i > 0 ; i--) {
if (stu[i] > stu[i-1]){
float swap = stu[i-1];
stu[i-1] = stu[i];
stu[i] = swap;
}
}
k--;
}
for (int i = 0; i < stu.length; i++) {
if (i == 10) break;
System.out.println(map.get(stu[i])+"号 "+stu[i]+"分" );
}
}