集合和IO的练习-学生成绩处理

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

分析:
从文件里读取数据肯定使用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 list = new ArrayList();

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

}

你可能感兴趣的:(集合和IO的练习-学生成绩处理)