本帖最后由 潘杰 于 2014-10-22 01:16 编辑
这是我做的学生那道题,你可以参考下
- package com.itheima;
- import java.io.BufferedWriter;
- import java.io.FileWriter;
- import java.io.IOException;
- import java.util.Map.Entry;
- import java.util.Scanner;
- import java.util.Set;
- import java.util.TreeMap;
- public class Test4 {
- /**
- * 4、 有五个学生,每个学生有3门课(语文、数学、英语)的成绩,
- * 写一个程序接收从键盘输入学生的信息,输入格式为:name,30,30,30(姓名,三门课成绩),
- * 然后把输入的学生信息按总分从高到低的顺序写入到一个名称"stu.txt"文件中。
- * 要求:stu.txt文件的格式要比较直观,打开这个文件,就可以很清楚的看到学生的信息。
- *
- */
- /*
- * 思路1、键入一个行字符串
- *2、将这个字符串用","进行切割并装入一个字符串数组中,如果这个字符数组的长度不为4,则提示输入的格式不正确,重新输入。
- *3、将切割后字符串数组进行转换,角标为0的字符串为姓名,角标为1,2,3的字符串分别转化成int型,代表语文、数学、英语成绩,
- * 并判断这个值是否在0-100中;如果出现类型转换异常或者数值不在0-100中,则提示输入输入格式不正确,重新输入。
- * 4、满足以上条件后,将得到的信息存入一个学生对象中。这个学生对象实现了Comparable接口,并具有一个总分的私有属性,
- * 其比较方法是根据学生对象的总分进行的比较。
- * 5、创建一个TreeMap集合,将学生对象作为键,学生总分作为值,传入这个map集合中。
- * 6、创建一个字符输出流,并遍历map集合,将遍历到的学生信息和学生总分写入一个"stu.txt"文件中。
- */
- public static void main(String[] args) {
- /*
- * zhangsan,80,100,90
- * lisi,100,100,100
- * xiaoqiang,60,70,80
- * huahua,50,60,40
- * xiaoming,90,90,90
- */
- method();
- }
- public static void method() {
- Scanner sc = new Scanner(System.in);
- // 定义一个TreeMap集合,用来存储学生信息和学生总分
- TreeMap<Student, Integer> map = new TreeMap<Student, Integer>();
- System.out.println("请输入五个学生信息,输入格式为:name,30,30,30(姓名,三门课成绩)");
- // 如果集合中没有装够5个学生信息,则一直循环。
- while (map.size() < 5) {
- String line = sc.nextLine();
- // 将键入的这一字符串用","进行切割,并装入一个字符串数组里。
- String[] split = line.split(",");
- // 如果切割后的字符串数组长度不为4,则提示重新输入,这里要注意的是:如果输入的中文的",",程序是不会识别的。
- if (split.length != 4) {
- System.out.println("您输入格式不正确,注意中文姓名后面的','要用半角符号,从新输入:");
- continue;
- }
- String name = split[0];
- int cn = 0;
- int ma = 0;
- int en = 0;
- try {
- cn = Integer.parseInt(split[1]);
- ma = Integer.parseInt(split[2]);
- en = Integer.parseInt(split[3]);
- // 如果得到的分数是<0或者是>100的,则提示您输入成绩不正确,请从新输入
- if (cn < 0 || cn > 100 || ma < 0 || ma > 100 || en < 0
- || en > 100) {
- System.out.println("您输入成绩不正确,请从新输入:");
- continue;
- }
- } catch (Exception e) { // 如果捕捉到异常,则提示重输并跳过本次循环。
- System.out.println("您输入格式不正确,从新输入:");
- continue;
- }
- // 如果程序运行到了这里,则证明这是一个正确的信息。创建这个学生对象,并将这个对象作为键,总分作为值存入。
- Student s = new Student(name, cn, ma, en);
- map.put(s, s.getSum());
- }
- // 循环结束,则证明map集合中已经录入了5个学生信息,下面将学生信息写入"stu.txt"文件中
- BufferedWriter bw = null; // 创建一个字符写入缓冲区,并指向null
- try {
- bw = new BufferedWriter(new FileWriter("stu.txt"));
- Set<Entry<Student, Integer>> entrySet = map.entrySet();
- // 将集合遍历取出学生信息,并写入文件中。
- for (Entry<Student, Integer> entry : entrySet) {
- Student student = entry.getKey();
- Integer sum = entry.getValue();
- bw.append(student.toString()); // 在文件中写入学生信息。
- bw.append("\t总分:" + sum); // 在文件中写入总分,并在总分前加入制表符
- bw.newLine(); // 写入换行
- }
- System.out.println("写入成功!");
- } catch (IOException e) {
- System.out.println("写入失败!"); // 如果发现异常,则提示写入失败。
- } finally { // 标准的关闭流操作。
- if (bw != null) {
- try {
- bw.close();
- } catch (IOException e) {
- e.printStackTrace();
- }
- }
- }
- }
- }
- // 创建一个学生类,并实现了Comparable接口。
- class Student implements Comparable<Student> {
- private String name;
- private int cn;
- private int ma;
- private int en;
- private int sum;
- // 定义一个4个参数的构造函数,参数顺序分别为姓名,语文成绩,数学成绩,英语成绩。
- // 由于在键入的时候已经加入了判断,所以这里就没有加入判断语句。
- public Student(String name, int cn, int ma, int en) {
- super();
- this.name = name;
- this.cn = cn;
- this.ma = ma;
- this.en = en;
- this.sum = cn + ma + en;
- }
- @Override
- // 重写hashCode方法
- public int hashCode() {
- final int prime = 31;
- int result = 1;
- result = prime * result + ((name == null) ? 0 : name.hashCode());
- return result;
- }
- @Override
- // 重写equals方法
- public boolean equals(Object obj) {
- if (this == obj)
- return true;
- if (obj == null)
- return false;
- if (getClass() != obj.getClass())
- return false;
- Student other = (Student) obj;
- if (name == null) {
- if (other.name != null)
- return false;
- } else if (!name.equals(other.name))
- return false;
- return true;
- }
- @Override
- // 实现其中的compareTo方法,并实现了成绩从高往低排序的方式。
- public int compareTo(Student o) {
- int num = o.getSum() - this.getSum(); // 这里将o和this的位置换了一下,实现了集合是以总分从高向低的排序。
- return num==0?o.getName().compareTo(this.getName()):num; //如果总分相同了,则再比较名字。
- }
- @Override
- // 重写toString,调用toString将打印学生的姓名,语文成绩,数学成绩,英语成绩。
- public String toString() {
- return "姓名=" + name + ", 语文成绩=" + cn + ", 数学成绩=" + ma + ", 英语成绩=" + en;
- }
- // ============生成set和get方法=================
- public String getName() {
- return name;
- }
- public void setName(String name) {
- this.name = name;
- }
- public int getCn() {
- return cn;
- }
- public void setCn(int cn) {
- this.cn = cn;
- }
- public int getMa() {
- return ma;
- }
- public void setMa(int ma) {
- this.ma = ma;
- }
- public int getEn() {
- return en;
- }
- public void setEn(int en) {
- this.en = en;
- }
- public int getSum() {
- return sum;
- }
- public void setSum(int sum) {
- this.sum = sum;
- }
- }
复制代码 |