Java.成绩排序--用数组和List两种方法实现

    技术2022-07-11  79

    链接:https://www.nowcoder.com/questionTerminal/0383714a1bb749499050d2e0610418b1 来源:牛客网  

    查找和排序

    题目:输入任意(用户,成绩)序列,可以获得成绩从高到低或从低到高的排列,相同成绩 都按先录入排列在前的规则处理。

    示例: jack      70 peter     96 Tom       70 smith     67

    从高到低  成绩 peter     96 jack      70 Tom       70 smith     67

    从低到高

    smith     67

    jack      70 Tom      70 peter     96

     

    输入描述:

    输入多行,先输入要排序的人的个数,然后输入排序方法0(降序)或者1(升序)再分别输入他们的名字和成绩,以一个空格隔开。

     

    输出描述:

    按照指定方式输出名字和成绩,名字和成绩之间以一个空格隔开

    示例1

    输入

    3 0 fang 90 yang 50 ning 70

    输出

    fang 90 ning 70 yang 50

    【解题思路】

    处理输入->  升序or降序,student类型的数组/List处理排序->  调用Arrays.Sort,由于对象和对象无法天生进行比较,所以的提供让两个对象比较的依据;

             eg:  Comparable 或者 Comparator , 这里使用Comparator

                    Comparable比较器  通过比较要实现排序只能实现升序或者降序一种,比较死板

                    Comparator比较器 比较灵活,通过比较要实现升序或者降序更得心应手

    按照题目要求输出 import java.util.Arrays; import java.util.Comparator; import java.util.Scanner; public class Main{ static class Student{ String name; int score; int number; //记录录入顺序 public Student(String name, int score, int number) { this.name = name; this.score = score; this.number = number; } } //Comparator 的功能,通过比较告诉我那个学生应该靠前 static class AscComparator implements Comparator<Student>{ @Override public int compare(Student o1, Student o2) { if (o1.score != o2.score){ return o1.score - o2.score; }else { return o1.number - o2.number; } } } static class DescComparator implements Comparator<Student>{ @Override public int compare(Student o1, Student o2) { if (o1.score != o2.score){ return o2.score - o1.score; }else { return o1.number - o2.number; } } } public static void main(String[] args) { //1.处理输入数据 Scanner scanner = new Scanner(System.in); while(scanner.hasNext()){ int n = scanner.nextInt(); int a = scanner.nextInt(); boolean AscOrDesc = true; //true--升序;false--降序 if (a == 0){ AscOrDesc = false;//应题目要求,输入0是降序 } Student[] students = new Student[n]; for (int i = 0; i < n ; i++) { String name = scanner.next(); int score = scanner.nextInt(); students[i] = new Student(name,score,i); } //这里为什么用数组而不是List,是因为我下面要调用的方法是Arrays.Sort, //Arrays.Sort方法需要的就是数组(见下面图) if (AscOrDesc) { Arrays.sort(students,new AscComparator()); }else { Arrays.sort(students,new DescComparator()); } //处理输出 for (int i = 0; i < n ; i++) { System.out.println(students[i].name+" "+students[i].score); } } } }

     

    【使用List 解题思路】 定义类,表示姓名和成绩 。

    实现方法中:先输入人数,再输入排序策略(0或者1),输入多组人名和成绩。

    按照排序策略进行排序输出。  

    import java.util.ArrayList; import java.util.Comparator; import java.util.List; import java.util.Scanner; class Student { public String name; public int score; public Student(String name, int score) { this.name = name; this.score = score; } } public class Main { public static void main(String[] args) { Scanner scanner = new Scanner(System.in); while (scanner.hasNext()) { int numPeople = scanner.nextInt(); int option = scanner.nextInt(); List<Student> stuList = new ArrayList<>(); for (int i = 0; i < numPeople; i++) { stuList.add(new Student(scanner.next(), scanner.nextInt())); } if (option == 0) { stuList.sort((o1, o2) -> o2.score - o1.score); } else if (option == 1) { stuList.sort((o1, o2) -> o1.score - o2.score); } for (Student student : stuList) { System.out.println(student.name + " " + student.score); } } } }

     
    Processed: 0.012, SQL: 9