美文网首页笔试&&面试经验Java学习笔记
集合和IO的练习-学生成绩处理

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

作者: 比轩 | 来源:发表于2016-11-13 23:44 被阅读62次

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

    分析:
    从文件里读取数据肯定使用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;
        }
    
    }
    

    相关文章

      网友评论

        本文标题:集合和IO的练习-学生成绩处理

        本文链接:https://www.haomeiwen.com/subject/akthpttx.html