2000年清华大学计算机研究生机试真题(Java自定义容器类的排序)

2000年清华大学计算机研究生机试真题

在编写过程中有不足之处望大家一起进步。


题眼

/**
* 题目描述:
* 有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码要小)。
*
* 本地测评完全正确,不知道为何ac问题
*
* @author Yuxi Zhao
* 注:首先说一下排序的返回值的含义。对于参与比较的两个Object,o1和o2,如果函数的返回值为正值,把o1排在o2后面;返回值为负值,
* 把o1排在o2前面。如果返回值是0,按照容器之前的顺序排列。在compareTo中,this相当于o1,传入的Object相当于o2
*/

Aimer的源码

package Beginning;

import java.util.ArrayList;
import java.util.Comparator;
import java.util.Scanner;


public class Sort {
    public static void main(String[] args) {
        Scanner scanner = new Scanner(System.in);
        int size = scanner.nextInt();
        String clear = scanner.nextLine();
        ArrayList<student> set = new ArrayList<student>();
        while (scanner.hasNext()) {//这句语句可以去掉
            while (size > 0) {
                set.add(new student(scanner.next(), scanner.nextInt(), scanner.nextInt()));// 自增变量的list怎么赋值
                size--;
            }
        }
        Object[] sets = set.toArray();
        java.util.Arrays.sort(sets, new myComparator());
        for (int i = 0; i < sets.length; i++) {
            System.out.println(sets[i]);
        }
    }
}

class student {
    String name;
    int age;
    int score;

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

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

class myComparator implements Comparator {
    public int compare(Object obj1, Object obj2) {
        student s1 = (student) obj1;
        student s2 = (student) obj2;
        if (s1.score != s2.score) {
            return s1.score - s2.score;
        }
        boolean tmp = s1.name.equals(s2.name);
        if (tmp != false) {
            return -1;
        } else {
            return s1.age - s2.age;
        }
    }
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值