/*
* 有五格学生,每个学生有三门的课程
* 从键盘输入以上数据(包括姓名,三门课成绩)
* 输入的格式:如:zhangsan,30,40,50 计算出总成绩
* 并把学生的信息和计算出的总分数,高低顺序存放在磁盘文件“stud.txt”中
*
* 1、描述学生对象
* 2、定义一个可以操作学生对象的工具类
*
* 思想:
* 1、通过获取键盘录入的一行数据,并将该行中的信息取出,封装成学生对象。
* 2、因为学生对象有很多,那么就需要存储,使用的集合,因为要对学生的总分排序,所以可以使用treeSet
* 3、将集合中的信息写入到一个文件中
* */
import java.util.*;
import java.io.*;
public class IO_test {
public void run() throws IOException{
Comparator cpt = Collections.reverseOrder();//这里顶一个比较器,由于需求是从高到低的排序,正常程序使用的是自然排序方式
//通过集合类Collections的特有方法reverseOrder(返回一个比较器,它强行逆转实现了 Comparable 接口的对象 collection 的自然顺序)
//返回的比较器,传参到类Student_tool的静态方法getStudent上。使得进行比较
Set<Student> s = Student_tool.getStudent(cpt);
Student_tool.writer(s);
}
}
class Student_tool{
public static Set<Student> getStudent(Comparator<Student> cpt) throws IOException{
/*1、定义工具类:实现从键盘输入数据,并且将数据放在集合TreeSet中,
* 2、通过传过来的Comparator<Student> cpt 比较器,来判断是否进行强制比较,如果cpt=null,则使用自然排序,否则使用比较器,
* 这样的好处是,在main入口处可以进行随意的选择比较情况
*
* 3、将输入的数据存到集合中,返回该集合
* */
BufferedReader bf = new BufferedReader(new InputStreamReader(System.in));
Set<Student> s = null;
if(cpt == null)
s = new TreeSet<Student>();
else s = new TreeSet<Student>(cpt);
String k = null;
while((k = bf.readLine())!=null){
if("over".equals(k))
break;
String[] y = k.split(",");
Student stu = new Student(y[0].toString(),
Integer.parseInt(y[1]),
Integer.parseInt(y[2]),
Integer.parseInt(y[3]));
s.add(stu);
}
return s;
}
public static void writer(Set<Student> s) throws IOException{
/*
* 通过传入的集合对象,将集合中的数据通过for增强循环,使用缓冲技术高效的写到student.txt文件中
* 刷新后,关闭流
* */
BufferedWriter bf = new BufferedWriter(new FileWriter("student.txt"));
for(Student k:s){
bf.write(k.toString());
bf.newLine();
bf.flush();
}
bf.close();
}
}
class Student implements Comparable<Student>{
/*
* 根据需求,封装的学生对象如下:
* 封装的对象,有可能会进行比较等操作,那么在封装的时,养成习惯,将compareTo、hashCode、equals三个方法一定要重写,另外实现Comparable接口
* 本例实现对姓名和sum进行自然排序
* */
private String name;
private int math,china,english;
private int sum;
Student(String name,int math,int china,int english){
this.name = name;
this.math = math;
this.china = china;
this.english = english;
sum = (math+china+english);
}
public String getName(){
return name;
}
public int getSum(){
return sum;
}
public String toString(){
return "姓名 = "+name+", 数学 = "+math+", 语文 = "+china+", 英语 = "+english+", 总分: "+sum;
}
@Override
public int compareTo(Student s) {
int n = new Integer(this.sum).compareTo(new Integer(s.sum));
if (n == 0)
return this.name.compareTo(s.name);
return n;
}
public int hashCode(){
System.out.println("3333");
return this.name.hashCode()+this.sum*78;
}
public boolean equals(Object o){
System.out.println("44444");
if(!(o instanceof Student)){
throw new RuntimeException("程序有误!");
}
Student s = (Student)o;
return this.name.equals(s.name)&& this.sum == s.sum;
}
}
|
|