Student(String name, int math, int chinese, int english) {
this.name = name;
this.math = math;
this.chinese = chinese;
this.english = english;
sum = math + chinese + english;
}
public String getName() {
return name;
}
public int getSum() {
return sum;
}
// 覆盖了默认的hashCode()方法以保证学生的唯一性
@Override
public int hashCode() {
return name.hashCode() + sum * 78;
}
@Override
public boolean equals(Object obj) {
if (!(obj instanceof Student)) // 判断传入的参数是否为Student类型,不是就会抛出类转型异常
throw new ClassCastException("类型不匹配");
Student s = (Student) obj;
return this.name.equals(s.name) && this.sum == s.sum; // 比较两个学生对象的姓名和总分数,相同则返回true,否则为false
}
// 实现接口所要求的方法,以便按我们所需要的方式排序学生对象
@Override
public int compareTo(Student o) {
int num = new Integer(this.sum).compareTo(new Integer(o.sum)); // 比较两个学生对象的总分数,以便按总分排序
if (num == 0) // 如果总分数相同,就比较姓名,次要条件就会以姓名排序
return this.name.compareTo(o.name);
return num;
}
// 自定义自己的打印学生对象方法
@Override
public String toString() {
return name + ",语文成绩:" + chinese + ",数学成绩:" + math + ",英语成绩:" + english;
}
}
// 收集学生信息的工具来
class StudentInfoTool {
public static Set<Student> getStudents() throws NumberFormatException,
IOException {
return getStudents(null);
}
// 从键盘获取学生信息,并存入到TreeSet集合中,该方法返回一个包含学生对象的Set集合
public static Set<Student> getStudents(Comparator<Student> cmp) // 传入一个比较器以便按需排序
throws NumberFormatException, IOException { // 为简化代码,就把异常直接抛出了,但实际开发中不能这么做
// 输入学生的信息,输入格式为:name,30,30,30(姓名,语文,数学,英语三门课成绩)。
System.out.println("输入学生的信息,输入格式为:name,30,30,30(姓名,语文,数学,英语三门课成绩)。");
BufferedReader bufr = new BufferedReader(new InputStreamReader(
System.in));
Set<Student> stus = null;
if (cmp == null)
stus = new TreeSet<Student>();
else
stus = new TreeSet<Student>(cmp);
String line = null;
while ((line = bufr.readLine()) != null) {
if ("".equals(line)) // 输入over就结束输入学生信息
break;
String[] info = line.split("\\,"); // 把输入的一行数据串按','切割以便获取姓名和各们课成绩数据
Student stu = new Student(info[0], Integer.parseInt(info[1]),
Integer.parseInt(info[2]), Integer.parseInt(info[3])); // 把获取的学生信息用来创建一个具体的学生对象
stus.add(stu); // 把学生对象添加到集合中
}
bufr.close(); // 关闭输入流,释放资源
return stus;
}
public class Test1 {
public static void main(String[] args) throws NumberFormatException,
IOException {
// sources为eclipse中java工程目录下的一个文件夹
File file = new File("stu.txt");