题目:
从提供的文件里读取数据,进行排序(成绩高的在前面,成绩相同按名字排序),排序完成后更改源文件名称,并将处理完成的数据写进文件中。
提示:学生姓名和成绩都有可能相同,但是这是两位不同的学生。
分析:
从文件里读取数据肯定使用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;
}
}