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;
}
}
}