案例:集合到文件(数据排序改进版)
-
需求:键盘录入5个学生信息(姓名,语文成绩,数学成绩,英语成绩)。
-
要求按照成绩总分从高到低写入文本文件
-
格式:姓名,语文成绩,数学成绩,英语成绩
举例:菜徐琨,60,40,50 -
思路:
- 定义学生类
- 创建TreeSet集合
- 键盘录入学生数据
- 创建学生对象,把键盘录入的数据对应赋值给学生对象的成员变量
- 把学生对象添加到TreeSet集合
- 创建字符缓冲流输出流
- 遍历学生,得到每一个学生对象
- 把学生对象的数据拼接成指定格式的字符串
- 调用字符缓冲输出流对象的方法写数据
- 释放资源
以图文和代码内容形式讲解
图文:
代码:
package Demo;
import java.io.*;
import java.util.Comparator;
import java.util.Scanner;
import java.util.TreeSet;
public class Demo {
public static void main(String[] args) throws IOException {
//建立TreeSet集合
TreeSet<Student> ts = new TreeSet<>(new Comparator<Student>() {
@Override
public int compare(Student s1,Student s2) {
int num;
//如果语文成绩后者大于前者,则降序
num=s2.getYw()-s1.getYw();//s2-s1的话降序
//同类可推 数学的
int num2=num==0?s2.getSx()-s1.getSx():num;
//同类可推 英语的
int num3=num2==0?s2.getYy()-s1.getYy():num2;
return num3;
}
});
//建立循环,总共执行5次
int i=1;
while(i<=5){
Scanner sc = new Scanner(System.in);
System.out.println("请输入第"+i+"个人的姓名");
String name = sc.nextLine();
System.out.println("请输入语文成绩");
int yw = sc.nextInt();
System.out.println("请输入数学成绩");
int sx = sc.nextInt();
System.out.println("请输入英语成绩");
int yy = sc.nextInt();
//建立学生类
Student st = new Student(name,yw,sx,yy);
//添加到集合
ts.add(st);
i++;
}
//将集合的内容添加到文件中
BufferedWriter bw = new BufferedWriter(new FileWriter("D:\\item\\Hellow\\javasss.txt"));
//开始写文件
for (Student x:ts){
StringBuilder sb = new StringBuilder();
//将内容写入同一对象字符串地址中,可以防止浪费资源和效率低下问题
sb.append(x.getName()).append(",").append(x.getYw()).append(",").append(x.getSx()).append(",").append(x.getYy());
bw.write(sb.toString());
bw.newLine();
bw.flush();
}
//释放资源
bw.close();
}
}
输出的结果