题目: 从提供的文件里读取数据,进行排序(成绩高的在前面,成绩相同按名字排序),排序完成后更改源文件名称,并将处理完成的数据写进文件中。 提示:学生姓名和成绩都有可能相同,但是这是两位不同的学生。

分析: 从文件里读取数据肯定使用io流来操作了。完成排序的话,将数据存储到集合中来处理,但是按照题目的要求,可能存在重复对象,所以map和set就不考虑的,采用list来实现,最后的排序用集合工具类Collections里面的sort方法来进行,因为成绩高的在前面,所以要将其循序进行逆反即可。具体的数据使用对象来处理,这样继承Comparable类后,直接就有了自然顺序。最后,因为要改文件名,所以也会涉及到File类的相关操作。

code:

package io;
/*
 * 从文件里读取学生的姓名和成绩 
 * 学生的名字和成绩都可能相同 
 * 数据存储到学生的对象里面 
 * 可以进行排序,成绩相同按照姓名排 
 * 成绩和姓名都相同的对象不能舍弃
 * 排序完成后,将其存储到新文件中
 * 
 * 分析:使用IO流获取文件中的数据
 * 实现Student对象,利用文本的数据初始化学生对象
 * 学生需要进行排序,但是重复对象不能够舍弃
 * 所以,treeSet和map都不能用,因为学生姓名和成绩都有可能相同
 * 使用list存储数据,排序使用集合工具类Collections实现
 * 成绩由高到低,所以可以考虑逆向
 */

import java.io.*;
import java.util.*;

public class IOTest {
	public static void main(String[] args) throws Exception {
		File source = new File("f:\\grade.txt");
		if(!source.exists()){
			throw new RuntimeException("找不到源文件");
		}
		
		BufferedReader br = new BufferedReader(new FileReader(source));
		List<Student> list = new ArrayList<Student>();

		String info = null;
		while ((info = br.readLine()) != null) {
			// 行头和行位空格去掉,否则会影响数据的初始化
			info = info.trim();
			// 文件内的存储形式为:name xx,按空格切割
			String[] nameAndGrade = info.split(" +");
			if (nameAndGrade.length == 2) {
				list.add(new Student(nameAndGrade[0], Integer.parseInt(nameAndGrade[1])));
			}
		}
		br.close();

		// 以上就是数据的获取,获取完成后开始数据的排序
		// 正常情况下,是按从小到大的,所以使用reverseOrder()逆向排序
		Collections.sort(list, Collections.reverseOrder());

		// 数据处理完成后,将list中的数据写回新的文件,此时就需要rename源文件的名字,
		// 然后清空源文件,吧新的数据写进去,使用迭代器进行遍历
		// 此处也可以用打印流实现,比缓冲流方便,我这里为了练习下以前的内容,就用缓冲流了
		File f = new File("F:\\newGrade.txt");// 改名后的文件

		if (!(source.renameTo(f))) {
			throw new RuntimeException("文件名更改失败");
		}
		BufferedWriter bw = new BufferedWriter(new FileWriter(f));

		Iterator<Student> it = list.iterator();

		while (it.hasNext()) {
			Student s = it.next();
			bw.write(s.getName() + "  " + s.getGrade());
			bw.newLine();
			bw.flush();
		}

		bw.close();
	}
}

//自定义Student类,实现Comparable接口
class Student implements Comparable<Student> {
	private String name;
	private int grade;

	public Student() {
	}

	public Student(String name, int grade) {
		this.name = name;
		this.grade = grade;
	}

	public String getName() {
		return name;
	}

	public void setName(String name) {
		this.name = name;
	}

	public int getGrade() {
		return grade;
	}

	public void setGrade(int grade) {
		this.grade = grade;
	}

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

	public int compareTo(Student s) {
		int num = this.grade - s.grade;

		return num == 0 ? this.name.compareTo(s.name) : num;
	}

}