题面如下:

给定学生的成绩单,成绩单中包含每个学生的姓名和分数,请按照要求将成绩单按成绩从高到低或从低到高的顺序进行重新排列。

对于成绩相同的学生,无论以哪种顺序排列,都要按照原始成绩单中靠前的学生排列在前的规则处理。

输入格式

第一行包含整数 N,表示学生个数。

第二行包含一个整数 0 或 1,表示排序规则,0 表示从高到低,1 表示从低到高。

接下来 N 行,每行描述一个学生的信息,包含一个长度不超过 10 的小写字母构成的字符串表示姓名以及一个范围在 0∼100 的整数表示分数。

输出格式

输出重新排序后的成绩单。

每行输出一个学生的姓名和成绩,用单个空格隔开。

数据范围

1≤N≤1000

思路:

先使用Student类存储每一个变量 

class Student {
    int index;
    //记录初始位置
    int score;
    //记录成绩
    String name;
    //姓名
    Student(int index,int score, String name){
        this.index = index;
        this.score = score;
        this.name = name;
    }
    @Override
    public String toString(){
        return name + " " + score;
    }
}

如果只是根据第二行的整数来确定升序或者降序的话,那么直接实现降序或升序的Comparator具体实现类然后根据第二个整数的值决定是否使用Collections.reverse(list)进行反转(或者直接倒序输出)即可,但是题面上说,必须保证输出顺序与输入顺序完全保持一致所以reverse()方法(和倒序输出方法)不能覆盖所有的测试用例。这时候可以另外给Student类一个整形属性--index来表示初始位置,然后实现两种Comparator(分别为升序和降序两种)接口的实现类作为参数传递给Collections.sort(List,Comparator)方法,然后正序输出即可

代码如下:

import java.util.*;


class Student {
    int index;
    //记录初始位置
    int score;
    //记录成绩
    String name;
    //姓名
    Student(int index,int score, String name){
        this.index = index;
        this.score = score;
        this.name = name;
    }
    @Override
    public String toString(){
        return name + " " + score;
    }
}

class compare_asc implements Comparator<Student>{
    @Override
    public int compare(Student stu1, Student stu2){//重写compare方法
        if(stu1.score == stu2.score){
            return stu1.index - stu2.index;//分数相同按照相对位置升序排序
        }
        return stu1.score - stu2.score;
        //返回值大于零会交换所以如果分数不同则按照升序排序
    }
}
class compare_desc implements Comparator<Student>{
    @Override
    public int compare(Student stu1,Student stu2){//降序排序
        if(stu1.score == stu2.score){
            return stu1.index - stu2.index;//分数相同按照相对位置升序排序
        }
        return stu2.score - stu1.score;//成绩不同按成绩降序排序
    }
}

public class Main{
    public static void main(String [] args){
        int n,flag;
        List <Student> students = new ArrayList<>();
        Scanner sc = new Scanner(System.in);
        n = sc.nextInt();
        flag = sc.nextInt();
        for(int i = 0 ; i < n; i ++){
            String name;
            int score;
            name = sc.next();
            score = sc.nextInt();
            Student stu = new Student(i,score,name); 
            
            students.add(stu);
        }
        //以上为输入
        if(flag == 1){
            Collections.sort(students,new compare_asc());//升序
        }else{
            Collections.sort(students,new compare_desc());//降序
        }
        
        for(Student stu : students){
            System.out.println(stu.toString());//输出
        }
        
        
        
    }
}

也可以只使用一个Comparator的实现类或者直接让Student类实现Comparable接口,这时候如果用例的排序方式和写好的不同则需要维护另外一个变量来确定相同相同成绩的区间然后根据初始位置排序,不过这样就太麻烦了如果有别的方法处理只有一个实现类的情况请告诉我一下,谢谢。以上就是本文的所有内容谢谢观看