从键盘录入学生成绩存入电脑硬盘并自定义排序

package com.microsoft.io;

import java.io.BufferedReader;
import java.io.BufferedWriter;
import java.io.FileWriter;
import java.io.IOException;
import java.io.InputStreamReader;
import java.util.Collections;
import java.util.Comparator;
import java.util.Set;
import java.util.TreeSet;

/**
 * 学生类实现比较器
 * 
 * @author liuwang
 */
class Student implements Comparable<Student> {
	private String name;
	private int math;
	private int english;
	private int chinese;
	private int sum;

	Student(String name, int math, int english, int chinese) { // 构造方法
		this.name = name;
		this.math = math;
		this.english = english;
		this.chinese = chinese;
		this.sum = math + english + chinese;
	}

	public String getName() {
		return name;
	}

	public int getMath() {
		return math;
	}

	public int getEnglish() {
		return english;
	}

	public int getChinese() {
		return chinese;
	}

	public int getSum() {
		return sum;
	}

	/**
	 * 重写hashCode方法。现比较两个学生对象的hashCode是否一致。如果一致才会继续比较equals。
	 */
	public int hashCode() {
		return name.hashCode() + sum * 37;
	}

	/**
	 * 重写equals方法
	 */
	public boolean equals(Object obj) {
		if (!(obj instanceof Student))
			throw new ClassCastException("类型不匹配!");
		Student s = (Student) obj;
		return this.name.equals(s.name) && this.sum == s.sum;//如果姓名和总分都相同则为同一个人。
	}
	/**
	 * 重写toString,指定一个输出格式。
	 */
	public String toString() {
		return "Student[" + name + "," + chinese + "," + math + "," + english
				+ "]";
	}
	/**
	 * 重写比较器。先比总分,如果相等再比较两个人都姓名。
	 */
	public int compareTo(Student s) {
		int num = new Integer(this.sum).compareTo(s.sum);
		if (num == 0) {
			return this.name.compareTo(s.name);
		}
		return num;
	}

}
	/**
	 * 学生工具类测试。
	 */
public class StudentTool {
	/**
	 * 方式一:默认比较器,总分是从低到高的不符合需求。
	 */
	public static Set<Student> getStudent() throws IOException {

		return getStudent(null);

	}
	/**
	 * 方式二:传一个自定义的比较器。
	 */
	public static Set<Student> getStudent(Comparator<Student> cmp)
			throws IOException {
		BufferedReader bufr = new BufferedReader(new InputStreamReader(
				System.in));  
		String line = null;
		Set<Student> stus;
		if (cmp == null)
			stus = new TreeSet<Student>();
		else
			stus = new TreeSet<Student>(cmp);

		while ((line = bufr.readLine()) != null) {
			if (("over").equals(line))  //读到"over"循环终止。
				break;
			String[] info = line.split(",");  //将读到的数据用","切割,装进info字符串数组。
			Student stu = new Student(info[0], Integer.parseInt(info[1]),
					Integer.parseInt(info[2]), Integer.parseInt(info[3]));//新建学生对象并运用构造函数进行初始化。
			stus.add(stu);//将学生对象添加到TreeSet集合当中。
		}
		bufr.close();//关闭缓冲区。
		return stus;//返回学生集合。
	}
	/**
	 * 将学生写入文件
	 */
	public static void writeToFile(Set<Student> stus) throws IOException {
		BufferedWriter bufw = new BufferedWriter(new FileWriter("stuinfo.txt"));//新建一个文件输入流
		for (Student stu : stus) {  //循环写入
			bufw.write(stu.toString() + "\t");//“\t”制表
			bufw.write(stu.getSum() + "");
			bufw.newLine();//换行
			bufw.flush();//刷新
		}
		bufw.close();//关闭缓冲区
	}

	public static void main(String[] args) throws IOException {
		Comparator<Student> cmp = Collections.reverseOrder();// 强行逆转默认比较器
		writeToFile(getStudent(cmp));
	}
}

你可能感兴趣的:(bufferedreader,TreeSet)