IO流和集合的联合练习


 * 需求: 有个五个学生,每个学生有三门课的成绩,从键盘输入以上数据(包括
 * 姓名,三门课总成绩)。并把学生的信息和计算出的总分数由高到低
 * 存放在磁盘文件“stud.txt:中。
 *
 * 1.描述学生对象
 * 2,定义一个可操作学生对象的工具类
 *
 * 思想:
 * 1,通过获取键盘录入一行数据,并将该行中的信息取出封装成学生对象
 * 2,因为学生有很多,那么就需要存储,使用到集合,因为要对学生的总分排序
 * 所以可以使用TreeSet.
 *
 * 3,l将集合的信息写入文本



import java.io.*;
import java.util.*;
public class StudentTest
{
    public static void main(String[] args) throws IOException
    {
	Comparator<Student> com = Collections.reverseOrder();
	//调用获得学生属性方法 返回一个集合(这个调用的是默认比较器)
	Set<Student> stus = StudentInfoTool.getStudents(com);
	
	//调用写入方法
	StudentInfoTool.write2File(stus);
    }

    
}


//学生类
//因为需要比较所以 实现 Comparable接口
class Student implements Comparable<Student>
{
    
    private String name;//姓名
    private int ma,cn,en;//三门成绩
    private int sum;//总分
    
    //构造方法
    Student(String name, int ma, int cn, int en)
    {
	this.name = name;
	this.ma = ma;
	this.cn = cn;
	this.en = en;
	sum = ma + cn + en;//总分
    }
    
    //得到姓名
    public String getName()
    {
	return name;
    }
    //得到总分
    public int getSum()
    {
	return sum;
    }
    
    //覆盖哈希表方法
    public int hashCode()
    {
	return name.hashCode()*78;
    }
    //覆盖equals方法
    public boolean equals(Object obj)
    {
	//如果传递过来的不是Student
	if(!(obj instanceof Student))
	{
	    throw new ClassCastException("类型不匹配");
	    
	}
	
	//obj 类型转强制换成Student类型
	Student s = (Student)obj;
	
	//如果是同姓名总分的人 是同一个人 
	return this.name.equals(s.name) && this.sum == s.sum;
    }

    //实现了接口  必须实现comparTo方法
    public int compareTo(Student s)
    {
	//比较总分
	int num = new Integer(this.sum).compareTo(new Integer(s.sum));
	
	if(num == 0)
	{
	    return this.name.compareTo(s.name);
	}
	return num;
    }
    
    //返回姓名 各科成绩
    public String toString()
    {
	return "student["+name+","+ma+","+cn+","+en+"]";
    }
}


//学生工具类
class StudentInfoTool
{
    public static Set<Student> getStudents() throws IOException
    {
	return null;
    }

    
    //从键盘获取集合中数据
    public static Set<Student> getStudents(Comparator<Student> com) throws IOException
    {
	//读取键盘
	BufferedReader bufr = 
		new BufferedReader(new InputStreamReader(System.in));
	
	//创建set集合 TreeSet集合
	Set<Student> stus = null;
	if(com==null)
	{
	    stus = new TreeSet<Student>();
	}
	else
	{
	    stus = new TreeSet<Student>(com);
	}
	
	
	//中间变量line
	String line = null;
	//需要抛出异常  进行遍历
	while((line = bufr.readLine()) !=null )
	{
	    //如果是over
	    if("over".equals(line))
	    {
		break;//结束循环读取
	    }
	    
	    //用逗号进行切割  使用split方法
	    String[] info = line.split(",");
	    
	    //把学生姓名 成绩封装成对象
	    Student stu = new Student(info[0],Integer.parseInt(info[1]),
		    			Integer.parseInt(info[2]), 
		    			Integer.parseInt(info[3]));
	    //将对象放入集合
	    stus.add(stu);
	}
	
	//关闭流
	bufr.close();
	
	//返回集合
	return stus;
    }
    
    
    //把集合写入文件  定义数据存储位置
    public static void write2File(Set<Student> stus) throws IOException
    {
	//创建写入
	BufferedWriter bufw = new BufferedWriter(new FileWriter("Stuinfo.txt"));
	
	//循环写入文件
	for(Student stu : stus)
	{
	    //写入姓名
	    bufw.write(stu.toString() +"   ");
	    //写入总成绩  因为得到的是int类型 要转换成字符型
	    bufw.write(stu.getSum()+ "");
	    //换行
	    bufw.newLine();
	    //刷新缓冲区
	    bufw.flush();
	    
	}
	//写入结束关闭流
	bufw.close();
    }
}




你可能感兴趣的:(IO流和集合的联合练习)