首页 > 试题广场 >

成绩排序

[编程题]成绩排序
  • 热度指数:22993 时间限制:C/C++ 1秒,其他语言2秒 空间限制:C/C++ 64M,其他语言128M
  • 算法知识视频讲解
有N个学生的数据,将学生数据按成绩从低到高排序,如果成绩相同则按姓名字符的字典序由小到大排序,如果姓名的字典序也相同则按照学生的年龄从小到大排序,并输出N个学生排序后的信息。

输入描述:
测试数据有多组,每组输入第一行有一个整数N(N<=1000),接下来的N行包括N个学生的数据。
每个学生的数据包括姓名(长度不超过100的字符串)、年龄(整形数)、成绩(小于等于100的正数)。


输出描述:
将学生信息按成绩进行排序,成绩相同的则按姓名的字母序进行排序。
然后输出学生信息,按照如下格式:
姓名 年龄 成绩

学生姓名的字母序区分字母的大小写,如A要比a的字母序靠前(因为A的ASC码比a的ASC码要小)。
示例1

输入

3
abc 20 99
bcd 19 97
bed 20 97

输出

bcd 19 97
bed 20 97
abc 20 99
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.util.ArrayList;
import java.util.Collections;
import java.util.Comparator;

public class Main {
    static class Student {
        String name;
        int age;
        int score;

        public Student() {
        }

        public Student(String name, int age, int score) {
            this.name = name;
            this.age = age;
            this.score = score;
        }

        @Override
        public String toString() {
            return name + " " + age + " " + score;
        }

    }

    public static void main(String[] args) throws IOException {
        BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
        ArrayList<Student> list = new ArrayList<>();
        int n = Integer.parseInt(br.readLine());
        for (int i = 0; i < n; i++) {
            String[] str = br.readLine().split(" ");
            Student st = new Student(str[0], Integer.parseInt(str[1]), Integer.parseInt(str[2]));
            list.add(st);
        }

        Collections.sort(list, new Comparator<Student>()
        {
            public int compare(Student o1, Student o2) {
                int num1= o1.score-o2.score;
                int num2= num1==0?o1.name.compareTo(o2.name):num1;
                int num3= num2==0?o1.age-o2.age:num2;
                return num3;
            }
        });

        /*list.sort(new Comparator<Student>() {
            @Override
            public int compare(Student o1, Student o2) {
                int num1= o1.score-o2.score;
                int num2= num1==0?o1.name.compareTo(o2.name):num1;
                int num3= num2==0?o1.age-o2.age:num2;
                return num3;
            }
        });*/

        for (Student ss : list) {
            System.out.println(ss);
        }
    }
}


发表于 2021-02-18 12:40:26 回复(0)
Java 面向对象写法,清晰可扩展
import java.util.Arrays;
import java.util.Scanner;

public class Main {
    public static void main(String[] args) {
        Scanner scanner = new Scanner(System.in);
        while (scanner.hasNext()){
            int n = scanner.nextInt();
            Student[] arr = new Student[n];
            for (int i = 0; i < n; i++) arr[i] = new Student(scanner.next(),scanner.nextInt(),scanner.nextInt());
            Arrays.sort(arr);
            for (Student student : arr) System.out.println(student);
        }
    }

    static class Student implements Comparable<Student>{
        String name;
        Integer age;
        Integer score;

        public Student(String name, Integer age, Integer score) {
            this.name = name;
            this.age = age;
            this.score = score;
        }

        //将学生数据按成绩从低到高排序,如果成绩相同则按姓名字符的字典序由小到大排序,如果姓名的字典序也相同则按照学生的年龄从小到大排序
        @Override
        public int compareTo(Student o) {
            if (this.score.compareTo(o.score)==0){
                if (this.name.compareTo(o.name)==0) return this.age.compareTo(o.age);
                else return this.name.compareTo(o.name);
            }else return this.score.compareTo(o.score);
        }

        //姓名 年龄 成绩
        @Override
        public String toString() {
            return name+" "+age+" "+score ;
        }
    }
}


发表于 2020-03-18 16:58:36 回复(0)
import java.io.BufferedReader;
import java.io.InputStreamReader;
import java.util.ArrayList;
import java.util.Collections;
import java.util.List;
import java.io.IOException;



public class Main {
    public static void main(String[] args) throws IOException {
        InputStreamReader inputStreamReader = new InputStreamReader(System.in);
        BufferedReader reader = new BufferedReader(inputStreamReader);
        int n = Integer.parseInt(reader.readLine());
        String[] line;
        List<Student> list = new ArrayList<>();
        for(int i = 0;i<n;i++) {
            line = reader.readLine().split(" ");
            list.add(new Student(line[0], Integer.parseInt(line[1]), Integer.parseInt(line[2])));
        }
        Collections.sort(list);
        for (Student student : list) {
            System.out.println(student.toString());
        }
        reader.close();
    }
}
class Student implements Comparable<Student>{

    
    public Student(String name,int age,int course) {
        this.name = name;
        this.age = age;
        this.course = course;
    }
    @Override
    public int compareTo(Student o) {
        if(o.course<course) {
            return 1;
        }else if (o.course==course) {
            if (o.name.compareTo(name)==0) {
                return age-o.age;
            }
            return -o.name.compareTo(name);
        }
        return -1;
    }
    int age;
    int course;
    String name;
    
    @Override
    public String toString() {
        return name + " "+age + " " + course;
    }
    
}

发表于 2019-01-09 16:27:48 回复(0)

Comparator接口的int compare(o1,o2)方法:compare()方法

返回负数表明o1(所代表的属性值)<o2(所代表的属性值),返回正数表明o1的大于o2的,如果返回0表明o1、o2相等

import java.util.ArrayList;
import java.util.Collections;
import java.util.Comparator;
import java.util.List;
import java.util.Scanner;
class Student {
    private String name;
    private int age;
    private int grade;
    public Student(String name, int age, int grade) {
        this.name = name;
        this.age = age;
        this.grade = grade;
    }
    public String getName() {
        return name;
    }
    public int getAge() {
        return age;
    }
    public int getGrade() {
        return grade;
    }
    public String toString() {
        return name + " " + age + " " + grade;
    }
}
public class Main {
    public static void main(String[] args) {
        Scanner scan = new Scanner(System.in);
        while (scan.hasNext()) {
            int n = scan.nextInt();
            List list = new ArrayList(n);
            for (int i = 0; i < n; i++) {
                String name = scan.next();
                int age = scan.nextInt();
                int grade = scan.nextInt();
                list.add(new Student(name, age, grade));
            }
            Collections.sort(list, new MyComparator());
            for (int i = 0; i < list.size(); i++) {
                System.out.println(list.get(i).toString());
            }
        }
    }
    private static class MyComparator implements Comparator {
        @Override
        public int compare(Student o1, Student o2) {
            if (o1.getGrade() != o2.getGrade()) {
                return o1.getGrade() > o2.getGrade() ? 1 : -1;
            } else if (o1.getName().compareTo(o2.getName()) != 0) {
                if (o1.getName().compareTo(o2.getName()) > 0) {
                    return 1;
                } else {
                    return -1;
                }
            } else {
                return o1.getAge() - o2.getAge();//默认升序
            }
        }
    }
}
编辑于 2018-05-29 10:38:23 回复(0)
import java.util.Arrays;
import java.util.Comparator;
import java.util.Scanner;

/**
 *
 * @author shenling
 */
public class Main {

    /**
     * @param args the command line arguments
     */
    public static void main(String[] args) throws Exception{
        Scanner sc = new Scanner(System.in);
        while (sc.hasNext()){
            int n = sc.nextInt();
            Student[] stu = new Student[n];
            sc.nextLine();
            for (int i = 0; i < n; i++){
                String[] info = sc.nextLine().split(" ");
                stu[i] = new Student(info[0], Integer.parseInt(info[1]), Integer.parseInt(info[2]));
            }
            
            Arrays.sort(stu, new MyComparator());
            
            for (int i = 0; i < n; i++){
                System.out.println(stu[i].getName() + " " + stu[i].getAge() + " " + stu[i].getScore());
            }
        }
    }
    
}

class MyComparator implements Comparator<Student>{

    @Override
    public int compare(Student o1, Student o2) {
        if (o1.getScore() > o2.getScore()){
            return 1;
        }
        else if (o1.getScore() < o2.getScore()){
            return -1;
        }
        else{
            if (o1.getName().compareTo(o2.getName()) > 0){
                return 1;
            }
            else if (o1.getName().compareTo(o2.getName()) == 0){
                if (o1.getAge() > o2.getAge()){
                    return 1;
                }
                else if (o1.getAge() < o2.getAge()){
                    return -1;
                }
                else{
                    return 0;
                }
            }
            else{
                return -1;
            }
            
        }
    }

    
}

class Student{
    private String name;
    private int age;
    private int score;

    public Student( String name, int age, int score){
        this.name = name;
        this.age = age;
        this.score = score;
    }
    
    public String toString(){
        return this.name + " " + this.age + " " + this.score;
    }
    
    /**
     * @return the name
     */
    public String getName() {
        return name;
    }

    /**
     * @param name the name to set
     */
    public void setName(String name) {
        this.name = name;
    }

    /**
     * @return the age
     */
    public int getAge() {
        return age;
    }

    /**
     * @param age the age to set
     */
    public void setAge(int age) {
        this.age = age;
    }

    /**
     * @return the score
     */
    public int getScore() {
        return score;
    }

    /**
     * @param score the score to set
     */
    public void setScore(int score) {
        this.score = score;
    }

}

发表于 2017-06-11 13:37:37 回复(0)
import java.util.Arrays;
import java.util.Scanner;
 
public class Main {
 
    public static void main(String[] args) {
        Scanner sc = new Scanner(System.in);
        while (sc.hasNextInt()) {
            int N= sc.nextInt();
            Student[] list = new Student[N];
            String name;
            int age, score;
            for (int i = 0; i < N; i++) {
                name = sc.next();
                age = sc.nextInt();
                score = sc.nextInt();
                list[i] = new Student(name, age,score);
            }
 
            Arrays.sort(list);
            for (int i = 0; i < N; i++) {
                System.out.println(list[i].name + " " + list[i].age + " " + list[i].score);
            }
        }
    }
 
    public static class Student implements Comparable<Student> {
        private int age;
        private int score;
        private String name;
        public Student(String name, int age, int score) {
            this.age = age;
            this.score = score;
            this.name = name;
        }
 
        @Override
        public int compareTo(Student o) {
            if (this.score > o.score) {
                return 1;
            } else if (this.score == o.score) {
                if (this.name.compareTo(o.name) > 0) {
                    return 1;
                } else if (this.name.compareTo(o.name) == 0) {
                    if (this.age > o.age) {
                        return 1;
                    } else if (this.age == o.age) {
                        return 0;
                    } else {
                        return -1;
                    }
                } else {
                    return -1;
                }
            } else {
                return -1;
            }
        }
    }
    
}

发表于 2017-05-12 15:15:00 回复(0)

问题信息

难度:
7条回答 12141浏览

热门推荐

通过挑战的用户

查看代码