A股上市公司传智教育(股票代码 003032)旗下技术交流社区北京昌平校区

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

  1. /*
  2. 有五个学生,每个学生有3门课的成绩,
  3. 从键盘输入以上数据(包括姓名,三门课成绩),
  4. 输入的格式:如:zhagnsan,30,40,60计算出总成绩,
  5. 并把学生的信息和计算出的总分数高低顺序存放在磁盘文件"stud.txt"中。
  6. */
  7. import java.io.*;
  8. import java.util.*;
  9. class Student implements Comparable<Student>
  10. {
  11. private String name;
  12. private int ma,cn,en;
  13. private int sum;

  14. Student(String name,int ma,int cn,int en)
  15. {
  16. this.name = name;
  17. this.ma = ma;
  18. this.cn = cn;
  19. this.en = en;
  20. sum = ma + cn + en;
  21. }

  22. public int compareTo(Student s)
  23. {
  24. int num = new Integer(this.sum).compareTo(new Integer(s.sum));
  25. if(num==0)
  26. return this.name.compareTo(s.name);
  27. return num;
  28. }

  29. public String getName()
  30. {
  31. return name;
  32. }
  33. public int getSum()
  34. {
  35. return sum;
  36. }

  37. public int hashCode()
  38. {
  39. return name.hashCode()+sum*78;

  40. }
  41. public boolean equals(Object obj)
  42. {
  43. if(!(obj instanceof Student))
  44. throw new ClassCastException("类型不匹配");
  45. Student s = (Student)obj;

  46. return this.name.equals(s.name) && this.sum==s.sum;
  47. }

  48. public String toString()
  49. {
  50. return "student["+name+", "+ma+", "+cn+", "+en+"]";
  51. }
  52. }

  53. class StudentInfoTool
  54. {
  55. public static Set<Student> getStudents()throws IOException
  56. {
  57. return getStudents(null);
  58. }

  59. public static Set<Student> getStudents(Comparator<Student> cmp)throws IOException
  60. {
  61. BufferedReader bufr = new BufferedReader(new InputStreamReader(System.in));

  62. String line = null;
  63. Set<Student> stus = null;
  64. if(cmp==null)
  65. stus = new TreeSet<Student>();
  66. else
  67. stus = new TreeSet<Student>(cmp);
  68. while((line=bufr.readLine())!=null)
  69. {
  70. if("over".equals(line))
  71. break;

  72. String[] info = line.split(",");

  73. Student stu = new Student(info[0],Integer.parseInt(info[1]),
  74. Integer.parseInt(info[2]),Integer.parseInt(info[3]));
  75. stus.add(stu);
  76. }
  77. bufr.close();
  78. return stus;
  79. }

  80. public static void write2File(Set<Student> stus)throws IOException
  81. {
  82. BufferedWriter bufw = new BufferedWriter(new FileWriter("stuinfo.txt"));
  83. for(Student stu : stus)
  84. {
  85. bufw.write(stu.toString()+"\t");
  86. bufw.write(stu.getSum()+"");
  87. bufw.newLine();
  88. bufw.flush();
  89. }
  90. bufw.close();
  91. }
  92. }

  93. class StudentInfoTest
  94. {
  95. public static void main(String[] args) throws IOException
  96. {

  97. Comparator<Student> cmp = Collections.reverseOrder();

  98. Set<Student> stus = StudentInfoTool.getStudents(cmp);

  99. StudentInfoTool.write2File(stus);
  100. }
  101. }
复制代码

评分

参与人数 1技术分 +1 收起 理由
朱神必 + 1

查看全部评分

2 个回复

倒序浏览
  1. /*
  2. 有五个学生,每个学生有3门课的成绩,
  3. 从键盘输入以上数据(包括姓名,三门课成绩),
  4. 输入的格式:如:zhagnsan,30,40,60计算出总成绩,
  5. 并把学生的信息和计算出的总分数高低顺序存放在磁盘文件"stud.txt"中。
  6. */
  7. import java.io.*;
  8. import java.util.*;
  9. //这个是学生类,有实现Comparable接口,可以进行比较
  10. class Student implements Comparable<Student>
  11. {
  12. private String name;//这个就不用加了吧
  13. private int ma,cn,en;
  14. private int sum;

  15. Student(String name,int ma,int cn,int en)
  16. {
  17. this.name = name;//构造方法
  18. this.ma = ma;
  19. this.cn = cn;
  20. this.en = en;
  21. sum = ma + cn + en;//算出总分
  22. }

  23. public int compareTo(Student s)
  24. {
  25. int num = new Integer(this.sum).compareTo(new Integer(s.sum));
  26. if(num==0)//先比较总分,总分相同再比较名字的字母顺序
  27. return this.name.compareTo(s.name);
  28. return num;
  29. }

  30. public String getName()
  31. {
  32. return name;
  33. }
  34. public int getSum()
  35. {
  36. return sum;
  37. }

  38. public int hashCode()
  39. {//计算hashCode值
  40. return name.hashCode()+sum*78;

  41. }
  42. public boolean equals(Object obj)
  43. {
  44. if(!(obj instanceof Student))
  45. throw new ClassCastException("类型不匹配");
  46. Student s = (Student)obj;

  47. return this.name.equals(s.name) && this.sum==s.sum;
  48. }

  49. public String toString()
  50. {
  51. return "student["+name+", "+ma+", "+cn+", "+en+"]";
  52. }
  53. }

  54. class StudentInfoTool//
  55. {
  56. public static Set<Student> getStudents()throws IOException
  57. {
  58. return getStudents(null);
  59. }

  60. public static Set<Student> getStudents(Comparator<Student> cmp)throws IOException
  61. {
  62. BufferedReader bufr = new BufferedReader(new InputStreamReader(System.in));

  63. String line = null;
  64. Set<Student> stus = null;
  65. if(cmp==null)
  66. stus = new TreeSet<Student>();
  67. else
  68. stus = new TreeSet<Student>(cmp);
  69. while((line=bufr.readLine())!=null)
  70. {
  71. if("over".equals(line))
  72. break;

  73. String[] info = line.split(",");

  74. Student stu = new Student(info[0],Integer.parseInt(info[1]),
  75. Integer.parseInt(info[2]),Integer.parseInt(info[3]));
  76. stus.add(stu);
  77. }
  78. bufr.close();
  79. return stus;
  80. }

  81. public static void write2File(Set<Student> stus)throws IOException
  82. {
  83. BufferedWriter bufw = new BufferedWriter(new FileWriter("stuinfo.txt"));
  84. for(Student stu : stus)
  85. {
  86. bufw.write(stu.toString()+"\t");
  87. bufw.write(stu.getSum()+"");
  88. bufw.newLine();
  89. bufw.flush();
  90. }
  91. bufw.close();
  92. }
  93. }

  94. class StudentInfoTest
  95. {
  96. public static void main(String[] args) throws IOException
  97. {

  98. Comparator<Student> cmp = Collections.reverseOrder();

  99. Set<Student> stus = StudentInfoTool.getStudents(cmp);

  100. StudentInfoTool.write2File(stus);
  101. }
  102. }
复制代码
就加了这点,想睡觉了

评分

参与人数 1技术分 +1 收起 理由
朱神必 + 1

查看全部评分

回复 使用道具 举报
本帖最后由 水蓝 于 2014-3-12 22:37 编辑

/*
有五个学生,每个学生有3门课的成绩,
从键盘输入以上数据(包括姓名,三门课成绩),
输入的格式:如:zhagnsan,30,40,60计算出总成绩,
并把学生的信息和计算出的总分数高低顺序存放在磁盘文件"stud.txt"中。
*/
package collection;

import java.io.*;
import java.util.*;

/**
*
* 这是一个用来描述学生信息的类
* 继承了Comparable接口后,就可以在许多地方调用比较器的地方被默认调用用于排序等比较操作了
* 比如在TreeSet中的排序
*/
class Student implements Comparable<Student>
{
        /**
         * 学生的姓名
         */
        private String name;

        /**
         * 这个就分别是数学、语文、英语的成绩
         */
        private int ma,cn,en;

        /**
         * 这个是总成绩
         */
        private int sum;

        /**
         * 构造器,不多说哈,你懂的
         * @param name
         * @param ma
         * @param cn
         * @param en
         */
        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;
        }

        /**
         * compareTo方法是上面类声明实现Comparable接口要实现的方法
         */
        @Override
        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;
        }

        /**
         * (访问器,没啥可说的)
         * @return
         */
        public String getName()
        {
                return name;
        }
        
        /**
         * (访问器,没啥可说的)
         * @return
         */
        public int getSum()
        {
                return sum;
        }

        /**
         * 这个方法覆盖了公共父类Object类的hashCode()方法
         * 常见应用在与哈希表有关的容器中,被调用。常与equals(Object obj)方法同事被覆盖重写
         * 默认情况下,通过内存地址映射算出来的值
         * 例如:HashMap、HashSet等
         */
        public int hashCode()
        {
                return name.hashCode()+sum*78;
        }
        
        /**
         * 这个方法覆盖了公共父类Object类的equals(Object obj)方法。
         * 用于比较两个对象是否相等。
         * 默认情况下,以内存地址映射进行比较。
         *
         */
        public boolean equals(Object obj)
        {
                if(!(obj instanceof Student))
                throw new ClassCastException("类型不匹配");
                Student s = (Student)obj;
               
                return this.name.equals(s.name) && this.sum==s.sum;
        }
        
        /**
         * 这个方法覆盖了公共父类Object类的toString()方法
         * 常用语打印对象相关的参数值
         * 默认打印的值与类和HashCode有关
         */
        public String toString()
        {
        return "student["+name+", "+ma+", "+cn+", "+en+"]";
        }
}

/**
* 这事一个维护学生信息的工具类
* 可以看出,这个类中,全都是静态方法,应用中不需要被生成对象
* @author CBY
*
*/
class StudentInfoTool
{
        /**
         * 这个方法用于获取所有学生信息(本质是调用方法getStudents(Comparator<Student> cmp))
         * @return
         * @throws IOException
         */
        public static Set<Student> getStudents()throws IOException
        {
                return getStudents(null);
        }

        /**
         * 这个方法用于从键盘输入获取学生信息
         * 因为返回的对象是一个TreeSet类实例
         * Set中的数据有顺序,且不重复。
         * 所以,可以理解为什么上面Student类定义的要继承Comparable接口
         * @param cmp 这个一个比较器接口,在代码中可以看出:
         *                     如果入参是一个比较器对象,则按比较器的规则排列和比较学生信息
         *                     如果入参是一个null,则按Student的compareTo方法来排序和比较学生信息
         * @return
         * @throws IOException
         */
        public static Set<Student> getStudents(Comparator<Student> cmp)throws IOException
        {
                //这边定义一个键盘输入流
                BufferedReader bufr = new BufferedReader(new InputStreamReader(System.in));
        
                String line = null;
                Set<Student> stus = null;
               
                //如果没有入参比较器,则要求TreeSet按Student的compareTo方法来排序和比较学生信息
                if(cmp==null)
                        stus = new TreeSet<Student>();
                //如果入参比较器,则要求TreeSet按比较器中定义的规则来排序和比较学生信息
                else
                        stus = new TreeSet<Student>(cmp);
               
                //逐行读取键盘中录入的学生信息(直到读到"over"字符串为止)
                while((line=bufr.readLine())!=null)
                {
                        if("over".equals(line))
                                break;
        
                        //分解键盘录入信息
                        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;
        }

        /**
         * 将信息写入到文件中
         * @param stus
         * @throws IOException
         */
        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()+"\t");
                        bufw.write(stu.getSum()+"");
                        bufw.newLine();
                        //刷新缓冲区
                        bufw.flush();
                }
                //关闭输出流
                bufw.close();
        }
}

/**
* 这是一个验证类
* @author CBY
*
*/
class StudentInfoTest
{
        public static void main(String[] args) throws IOException
        {
                //这边定义了一个比较器(将Student的compareTo的规则进行反向返回,也就是倒序排列)
                Comparator<Student> cmp = Collections.reverseOrder();
               
                //获取学生信息
                Set<Student> stus = StudentInfoTool.getStudents(cmp);
               
                //将获取到的学生信息输出到文件中。
                StudentInfoTool.write2File(stus);
        }
}

评分

参与人数 1技术分 +1 收起 理由
朱神必 + 1

查看全部评分

回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马