黑马程序员技术交流社区

标题: 找了道面试题做了做,看看那还能改进,做的时间太长了 [打印本页]

作者: syz1993    时间: 2015-1-9 01:57
标题: 找了道面试题做了做,看看那还能改进,做的时间太长了
本帖最后由 syz1993 于 2015-1-9 09:33 编辑
  1. <p>package com.heima;
  2. /**
  3. *
  4. * 有五个学生,每个学生有3门课(语文、数学、英语)的成绩,写一个程序接收从键盘输入学生的信息,
  5. * 输入格式为:name,30,30,30(姓名,三门课成绩),然后把输入的学生信息按总分从高到低的
  6. * 顺序写入到一个名称"stu.txt"文件中。要求:stu.txt文件的格式要比较直观,打开这个文件,
  7. * 就可以很清楚的看到学生的信息。
  8. * @author syz
  9. *
  10. */
  11. import java.io.*;
  12. import java.util.*;
  13. public class Test4 {
  14. public static void main(String[] args) {
  15.         BufferedReader bufr=null;
  16.         BufferedWriter bufw=null;
  17.         TreeMap<Integer,String> tm=new TreeMap<Integer,String>();
  18.         String line=null;
  19.         System.out.println("请按格式进行输入(格式:name,30,30,30(姓名,三门课成绩)");
  20.         try {
  21.                 bufr=new BufferedReader(new InputStreamReader(System.in));
  22.                 bufw=new BufferedWriter(new FileWriter("stu.txt"));
  23.                 while((line=bufr.readLine())!=null)
  24.                 {
  25.                         if(line.equals("over"))
  26.                         {
  27.                                 break;
  28.                         }
  29.                         if(isOk(line))
  30.                         {
  31.                                 //将总分最为key,和输入的数据作为value存入TreeMap集合,默认会按成绩从小到大排序
  32.                                 String[]strs=line.split(",");
  33.                                 tm.put(sum(strs), line);
  34.                         }else
  35.                         {
  36.                                 System.out.println("输入格式不正确,请重新输入");
  37.                                 continue;
  38.                         }
  39.                         
  40.                 }
  41.           //把TreeMap的value存入Collection集合
  42.                 Collection<String> coll=tm.values();
  43.                 //把Collection集合存入List集合,并进行反转
  44.                 List<String>list=new ArrayList<String>(coll);
  45.                 Collections.reverse(list);
  46.                 Iterator<String> it=list.iterator();
  47.                 String geshi="                           成绩表                                          ";
  48.                
  49.                 bufw.write(geshi);
  50.                 bufw.newLine();
  51.                 //把数据存入文件中
  52.                 while(it.hasNext())
  53.                 {   String str=it.next();
  54.                     System.out.println(str);
  55.                     String[]s=str.split(",");
  56.                     bufw.write("姓名:"+s[0]);
  57.                     bufw.write("\t");
  58.                     bufw.write("  ");
  59.                     bufw.write("语文成绩:"+s[1]);
  60.                     bufw.write("\t");
  61.                     bufw.write("  ");
  62.                     bufw.write("数学成绩:"+s[2]);
  63.                     bufw.write("\t");
  64.                     bufw.write("  ");
  65.                     bufw.write("英语成绩:"+s[3]);
  66.                     bufw.write("\t");
  67.                         
  68.                         //System.out.println(it.next());
  69.                         bufw.newLine();
  70.                 }
  71.         } catch (IOException e) {
  72.                 // TODO Auto-generated catch block
  73.                 e.printStackTrace();
  74.         }
  75.         finally
  76.         {
  77.                 if(bufr!=null)
  78.                         try {
  79.                                 bufr.close();
  80.                         } catch (IOException e) {
  81.                                 // TODO Auto-generated catch block
  82.                                 e.printStackTrace();
  83.                         }
  84.                 if(bufw!=null)
  85.                         try {
  86.                                 bufw.close();
  87.                         } catch (IOException e) {
  88.                                 // TODO Auto-generated catch block
  89.                                 e.printStackTrace();
  90.                         }
  91.         }
  92.                
  93. }
  94. //判断输入格式是否正确
  95. public static boolean isOk(String str)
  96. {
  97.         String s=".+,[1-9]\\d*0*,[1-9]\\d*0*,[1-9]\\d*0*";
  98.         
  99.         return str.matches(s);
  100. }
  101. //求出总分是多少
  102. public static int sum(String[] str)
  103. {   int s=0;
  104.         for (int i = 1; i < str.length; i++) {
  105.                 s+=Integer.parseInt(str[i]);
  106.         }
  107.         return s;
  108. }
  109. }
  110. //创建一个学生类
  111. class Student
  112. {
  113. private String name;
  114. private int chinese;
  115. private int math;
  116. private int english;
  117. public Student(String name, int chinese, int math, int english) {
  118.         super();
  119.         this.name = name;
  120.         this.chinese = chinese;
  121.         this.math = math;
  122.         this.english = english;
  123. }




  124. }</p>
复制代码
做的时间有点长了,唉~要是面试就完了,不过还是做出来了。(下面发了修改了的)

作者: 邓士林    时间: 2015-1-9 08:18
我看了下你的代码。我还没看到框架集合那部分的内容,但是你没必要创建那么多字符串类型,可以创建一个Student类型集合,而且对于分数的类型,可以设置为int,一方面是比较的时候方便,不必搞个字符串,费事,统计的时候也麻烦,有空我在用我的想法试试
作者: syz1993    时间: 2015-1-9 09:08
邓士林 发表于 2015-1-9 08:18
我看了下你的代码。我还没看到框架集合那部分的内容,但是你没必要创建那么多字符串类型,可以创建一个Stud ...

谢谢你的意见,是打算用Student类的上面的Student类也没用着,忘了,我再试试。
作者: syz1993    时间: 2015-1-9 09:32
本帖最后由 syz1993 于 2015-1-9 09:47 编辑
  1. <p>package com.heima;
  2. /**
  3. *
  4. * 有五个学生,每个学生有3门课(语文、数学、英语)的成绩,写一个程序接收从键盘输入学生的信息,
  5. * 输入格式为:name,30,30,30(姓名,三门课成绩),然后把输入的学生信息按总分从高到低的
  6. * 顺序写入到一个名称"stu.txt"文件中。要求:stu.txt文件的格式要比较直观,打开这个文件,
  7. * 就可以很清楚的看到学生的信息。
  8. * @author syz</p><p>  思路:
  9. *1、把存入的字符串按","分割成字符串数组,把数组后三位转为int型存入Student类(Student有比较器,比较总分)
  10.   2、存入TreeSet集合,然后用输出流输出就行了
  11. */
  12. import java.io.*;
  13. import java.util.*;
  14. public class Test4 {
  15. public static void main(String[] args) {
  16.         BufferedReader bufr=null;
  17.         BufferedWriter bufw=null;
  18.         TreeSet<Student> tm=new TreeSet<Student>();
  19.         String line=null;
  20.         System.out.println("请按格式进行输入(格式:name,30,30,30(姓名,三门课成绩)");
  21.         try {
  22.                 bufr=new BufferedReader(new InputStreamReader(System.in));
  23.                 bufw=new BufferedWriter(new FileWriter("stu.txt"));
  24.                 while((line=bufr.readLine())!=null)
  25.                 {
  26.                         if(line.equals("over"))
  27.                         {
  28.                                 break;
  29.                         }
  30.                         if(isOk(line))
  31.                         {   String[]strs=line.split(",");
  32.                                 Student stu=new Student(strs[0],Integer.parseInt(strs[1]),Integer.parseInt(strs[2]),Integer.parseInt(strs[3]));                                
  33.                                 tm.add( stu);
  34.                         }else
  35.                         {
  36.                                 System.out.println("输入格式不正确,请重新输入");
  37.                                 continue;
  38.                         }
  39.                         
  40.                 }
  41.          
  42.                 Iterator<Student> it=tm.iterator();
  43.                 String geshi="                           成绩表                                          ";
  44.                
  45.                 bufw.write(geshi);
  46.                 bufw.newLine();
  47.                 //把数据存入文件中
  48.                 while(it.hasNext())
  49.                 {   Student str=it.next();
  50.                    // System.out.println(str);
  51.                     
  52.                     bufw.write("姓名:"+str.getName());
  53.                     bufw.write("\t");
  54.                     bufw.write("  ");
  55.                     bufw.write("语文成绩:"+str.getChinese());
  56.                     bufw.write("\t");
  57.                     bufw.write("  ");
  58.                     bufw.write("数学成绩:"+str.getMath());
  59.                     bufw.write("\t");
  60.                     bufw.write("  ");
  61.                     bufw.write("英语成绩:"+str.getEnglish());
  62.                     bufw.write("\t");
  63.                         
  64.                         //System.out.println(it.next());
  65.                         bufw.newLine();
  66.                 }
  67.         } catch (IOException e) {
  68.                 // TODO Auto-generated catch block
  69.                 e.printStackTrace();
  70.         }
  71.         finally
  72.         {
  73.                 if(bufr!=null)
  74.                         try {
  75.                                 bufr.close();
  76.                         } catch (IOException e) {
  77.                                 // TODO Auto-generated catch block
  78.                                 e.printStackTrace();
  79.                         }
  80.                 if(bufw!=null)
  81.                         try {
  82.                                 bufw.close();
  83.                         } catch (IOException e) {
  84.                                 // TODO Auto-generated catch block
  85.                                 e.printStackTrace();
  86.                         }
  87.         }
  88.                
  89. }
  90. //判断输入格式是否正确
  91. public static boolean isOk(String str)
  92. {
  93.         String s=".+,[1-9]\\d*0*,[1-9]\\d*0*,[1-9]\\d*0*";
  94.         
  95.         return str.matches(s);
  96. }

  97. }
  98. //创建一个学生类
  99. class Student implements Comparable
  100. {
  101. private String name;
  102. private int chinese;
  103. private int math;
  104. private int english;
  105. private int sum;
  106. public Student(String name, int chinese, int math, int english) {
  107.         super();
  108.         this.name = name;
  109.         this.chinese = chinese;
  110.         this.math = math;
  111.         this.english = english;
  112.         this.sum=this.chinese+this.math+this.english;
  113. }
  114. public String getName() {
  115.         return name;
  116. }
  117. public void setName(String name) {
  118.         this.name = name;
  119. }
  120. public int getChinese() {
  121.         return chinese;
  122. }
  123. public void setChinese(int chinese) {
  124.         this.chinese = chinese;
  125. }
  126. public int getMath() {
  127.         return math;
  128. }
  129. public void setMath(int math) {
  130.         this.math = math;
  131. }
  132. public int getEnglish() {
  133.         return english;
  134. }
  135. public void setEnglish(int english) {
  136.         this.english = english;
  137. }
  138. @Override
  139. public int compareTo(Object o) {
  140.         Student stu=(Student)o;
  141.         if(this.sum>stu.sum)
  142.                 return -1;
  143.         if(this.sum==stu.sum)
  144.                 return 0;
  145.         return 1;
  146. }

  147. }
  148. </p>
复制代码


改了下,再看看
作者: 446111220    时间: 2015-1-9 09:33
大神啊   看着好复杂啊
作者: syz1993    时间: 2015-1-9 09:38
446111220 发表于 2015-1-9 09:33
大神啊   看着好复杂啊

也不是很复杂,知道思路就简单了。

作者: xingxing124    时间: 2015-1-9 11:52
lz是准备上25号这一期的吗,感觉我和lz还有很大的差距啊
作者: syz1993    时间: 2015-1-13 00:40
xingxing124 发表于 2015-1-9 11:52
lz是准备上25号这一期的吗,感觉我和lz还有很大的差距啊

多做点题就行了,最近要面试了,我的基础还得加强一下




欢迎光临 黑马程序员技术交流社区 (http://bbs.itheima.com/) 黑马程序员IT技术论坛 X3.2