题目1061:成绩排序

题目描述:
有N个学生的数据,将学生数据按成绩高低排序,如果成绩相同则按姓名字符的字母序排序,如果姓名的字母序也相同则按照学生的年龄排序,并输出N个学生排序后的信息。

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

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

样例输入:
3
abc 20 99
bcd 19 97
bed 20 97

样例输出:
bcd 19 97
bed 20 97
abc 20 99
提示:
学生姓名的字母序区分字母的大小写,如A要比a的字母序靠前(因为A的ASC码比a的ASC码要小)。

很基础的一道题,之前用C++AC过,现在用Java重新做一遍

import java.util.Scanner;

class Student{
    String name;
    int age;
    int score;
    void swap(Student s){
        String min = s.name;
        s.name = this.name;
        this.name = min;

        this.age = s.age^this.age;
        s.age = s.age^this.age;
        this.age =  s.age^this.age;

        this.score = s.score^this.score;
        s.score = s.score^this.score;
        this.score = s.score^this.score;
    }

    void compare(Student s){
        if(s.score < this.score){
            this.swap(s);
        }else if(s.score == this.score && this.name.compareTo(s.name) > 0){
            this.swap(s);
        }else if(s.score == this.score && this.name.compareTo(s.name) == 0 && s.age < this.age){
            this.swap(s);
        }
    }

    void set(Student s){
        this.score = s.score;
        this.name = s.name;
        this.age = s.age;
    }
}

public class Main {

    public static void main(String args[]){
        Student[] s = new Student[1000];
        Scanner sc = new Scanner(System.in);
        int n;

        while(sc.hasNext()){
            n = sc.nextInt();
            for(int i=0;inew Student();
                s[i].name = sc.next();
                s[i].age = sc.nextInt();
                s[i].score = sc.nextInt();
            }


            for(int i=0;inew Student();
                min.set(s[i]);;
                for(int j=i;jfor(int i=0;i" " + s[i].age + " " + s[i].score);
            }
        }

        sc.close();
    }

}
/**************************************************************
    Problem: 1061
    User: zzuljs
    Language: Java
    Result: Accepted
    Time:1600 ms
    Memory:93408 kb
****************************************************************/

排序是自己写的,用的选择排序,比较low
看见别人用Comparable接口来进行排序,感觉挺高大上的,学习一下——

import java.io.BufferedReader;
import java.io.InputStreamReader;
import java.io.StreamTokenizer;
import java.util.Arrays; 
public class Main {
    /*
     * 1061
     */
    public static void main(String[] args) throws Exception{
        StreamTokenizer st = new StreamTokenizer(new BufferedReader(
                new InputStreamReader(System.in)));
        while (st.nextToken() != StreamTokenizer.TT_EOF) {
            int N = (int)st.nval;
            Student[] students = new Student[N];
            for (int i = 0; i < N; i++) {
                st.nextToken();
                String name = st.sval;
                st.nextToken();
                int age = (int)st.nval;
                st.nextToken();
                int score = (int)st.nval;
                Student student = new Student(name, age, score);
                students[i] = student;
            }
            Arrays.sort(students);
            for (int i = 0; i < N; i++) {
                System.out.println(students[i].getName()+" "+
                    students[i].getAge()+" "+students[i].getScore());
            }
        }
    }
}
class Student implements Comparable{   
    private String name ;
    private int age ;
    private int score;

    public String getName() {
        return name;
    }
    public void setName(String name) {
        this.name = name;
    }
    public int getAge() {
        return age;
    }
    public void setAge(int age) {
        this.age = age;
    }
    public int getScore() {
        return score;
    }
    public void setScore(int score) {
        this.score = score;
    }  
    public Student(String name, int age, int score) {
        super();
        this.name = name;
        this.age = age;
        this.score = score;
    }
    public int compareTo(Student o) {
        if (o.getScore()!=this.getScore()) {
            return this.getScore() - o.getScore() ;
        }else {
            if (!o.getName().equals(this.getName())) {
                return this.getName().compareTo(o.getName());
            }else {
                return this.getAge()-o.getAge();
            }
        }
    }     
} 

/**************************************************************
    Problem: 1061
    User: zzuljs
    Language: Java
    Result: Accepted
    Time:1510 ms
    Memory:102136 kb
****************************************************************/

貌似用管道流输入更快?
但显然用Arrays模板排序更占空间以及更耗时间,需要注意。

你可能感兴趣的:(题目1061:成绩排序)