黑马程序员技术交流社区

标题: 发一个小程序,感觉代码超乱。 怎么优化下 [打印本页]

作者: 山西_李帅    时间: 2013-4-1 12:05
标题: 发一个小程序,感觉代码超乱。 怎么优化下
/*
        三个学生英语,数学,语文成绩,总成绩排序输出

        分析:
        1. 创建一个学生类有姓名和学号的属性 private.
           设置姓名和属性的set、get方法.
           sum方法——求总成绩,并进行排序
        2. 主函数.
                1,设置姓名学号
                2, 获取成绩的随机数
                3, 求总成绩,并进行排序
        3. 调用print方法
       


*/
import java.util.*;
class Test1
{

        public static void main(String[] args)
        {
               
                Person p1 = new Person();
                Person p2 = new Person();
                Person p3 = new Person();

                //设置张三和id,并获取三科成绩
                p1.setName("张三");
                p1.setId(1);
                Random ran = new Random();
                p1.english=ran.nextInt(61)+40;               
                p1.chinese=ran.nextInt(61)+40;
                p1.math=ran.nextInt(61)+40;

                //设置李四和id,并获取三科成绩
                p2.setName("李四");
                p2.setId(2);
                p2.english=ran.nextInt(61)+40;               
                p2.chinese=ran.nextInt(61)+40;
                p2.math=ran.nextInt(61)+40;

                //设置王五和id,并获取三科成绩
                p3.setName("王五");
                p3.setId(3);
                p3.english=ran.nextInt(61)+40;               
                p3.chinese=ran.nextInt(61)+40;
                p3.math=ran.nextInt(61)+40;

               

                //判断他们的总成绩并进行排序
               
                if( p1.sum() < p2.sum()){
                        Person p=p1;
                        p1 = p2;
                        p2 = p;
                }

                if( p1.sum() < p3.sum()){
                        Person p=p1;
                        p1 = p3;
                        p3 = p;
                }

                if( p2.sum() < p3.sum()){
                        Person p=p2;
                        p2 = p3;
                        p3 = p;
                }

                //排序后调用print方法打印
                p1.print();
                p2.print();
                p3.print();

        }
}








import java.util.*;
class Person
{
        private String name;        //成员属性——姓名
        private int id;                        //成员属性——学号
        int english;                //成员属性——英语成绩
        int math;                        //成员属性——数学成绩
        int chinese;                //成员属性——语文成绩
        int sum;                        //成员属性——总成绩
       
        //无参构造函数
        Person(){
       
        }

        //有参构造函数
        void Score(String name, int id){
                this.name=name;
                this.id=id;
        }

        //姓名的set方法
        public void setName(String name){
                this.name=name;
        }
       
        //学号的set方法
        public void setId(int id){
                this.id=id;
        }

        //姓名的get方法
        public String getName(){
                return name;
        }

        //学号的get方法
        public int getId(){
                return id;
        }

        //总成绩sum方法
        public int sum(){
                return sum = english + math +chinese;
        }

        public void print(){

                System.out.println("姓名:"+getName()+"  学号:"+getId()+"  英语:"+ english +"  数学:"+ math
                        +"  语文:"+chinese+"   总成绩:"+sum());
               
        }

       


}

作者: 山西_李帅    时间: 2013-4-1 12:17
/*
        三个学生英语,数学,语文成绩,总成绩排序输出
        分析:
        1. 创建一个学生类有姓名和学号的属性 private.
           设置姓名和属性的set、get方法.
           sum方法——求总成绩,并进行排序
        2. 主函数.
                1,设置姓名学号
                2, 获取成绩的随机数
                3, 求总成绩,并进行排序
        3. 调用print方法
*/
import java.util.*;
class Test1
{
        public static void main(String[] args)
        {
               
                Person p1 = new Person();
                Person p2 = new Person();
                Person p3 = new Person();

                //设置张三和id,并获取三科成绩
                p1.setName("张三");
                p1.setId(1);
                p1.english();               
                p1.chinese();
                p1.math();

                //设置李四和id,并获取三科成绩
                p2.setName("李四");
                p2.setId(2);
                p2.english();               
                p2.chinese();
                p2.math();

                //设置王五和id,并获取三科成绩
                p3.setName("王五");
                p3.setId(3);
                p3.english();               
                p3.chinese();
                p3.math();

                //判断他们的总成绩并进行排序,
               
                if( p1.sum() < p2.sum()){
                        Person p=p1;
                        p1 = p2;
                        p2 = p;
                }

                if( p1.sum() < p3.sum()){
                        Person p=p1;
                        p1 = p3;
                        p3 = p;
                }

                if( p2.sum() < p3.sum()){
                        Person p=p2;
                        p2 = p3;
                        p3 = p;
                }

                //排序后调用print方法打印
                p1.print();
                p2.print();
                p3.print();

        }
}





import java.util.*;
class Person
{
        private String name;        //成员属性——姓名
        private int id;                        //成员属性——学号
        int english;                //成员属性——英语成绩
        int math;                        //成员属性——数学成绩
        int chinese;                //成员属性——语文成绩
        int sum;                        //成员属性——总成绩

        //无参构造函数
        Person(){
       
        }

        //有参构造函数
        void Score(String name, int id){
                this.name=name;
                this.id=id;
        }

        //姓名的set方法
        public void setName(String name){
                this.name=name;
        }

        //学号的set方法
        public void setId(int id){
                this.id=id;
        }

        //姓名的get方法
        public String getName(){
                return name;
        }

        //学号的get方法
        public int getId(){
                return id;
        }

        //总成绩sum方法
        public int sum(){
                return sum = english + math +chinese;
        }

        //返回英语成绩值english方法
        public int english(){
                Random ran = new Random();
                return(english=ran.nextInt(61)+40);
        }

        //返回数学成绩值math方法
        public int math(){
                Random ran = new Random();
                return(math=ran.nextInt(61)+40);
        }

        //返回语文成绩值chinese方法
        public int chinese(){
                Random ran = new Random();
                return(chinese=ran.nextInt(61)+40);
        }

        //显示姓名,学号,成绩print方法
        public void print(){
                System.out.println("姓名:"+getName()+"  学号:"+getId()+"  英语:"+ english +"  数学:"+ math
                        +"  语文:"+chinese+"   总成绩:"+sum());               
        }

}

作者: 山西_李帅    时间: 2013-4-1 12:22
上面我自己改了下,是不是代码太长了。
作者: 邵震    时间: 2013-4-1 12:26
额 好长

我先占楼


顺便问下 你学到第几天的视频了

作者: 王亚东    时间: 2013-4-1 12:30
排序时不可以改变原来的对象,我写的不知道你有没有学到,应该正规些:
  1. package Test;
  2. import java.util.ArrayList;
  3. import java.util.Collections;
  4. import java.util.Comparator;
  5. import java.util.List;
  6. import java.util.Random;
  7. /*
  8. 三个学生英语,数学,语文成绩,总成绩排序输出

  9. 分析:
  10. 1. 创建一个学生类有姓名和学号的属性 private.
  11.    设置姓名和属性的set、get方法.
  12.    sum方法——求总成绩,并进行排序
  13. 2. 主函数.
  14.         1,设置姓名学号
  15.         2, 获取成绩的随机数
  16.         3, 求总成绩,并进行排序
  17. 3. 调用print方法

  18. */

  19. public class Demo01 {
  20.         public static void main(String[] args) throws Exception {
  21.                 List<Student> list = new ArrayList<Student>();
  22.                 Random random = new Random();
  23.                
  24.                 Student s1 = new Student("张三",1);
  25.                 s1.setChinese(random.nextInt(61)+40);
  26.                 s1.setMath(random.nextInt(61)+40);
  27.                 s1.setEnglish(random.nextInt(61)+40);
  28.                 list.add(s1);
  29.                 Student s2 = new Student("李四",2);
  30.                 s2.setChinese(random.nextInt(61)+40);
  31.                 s2.setMath(random.nextInt(61)+40);
  32.                 s2.setEnglish(random.nextInt(61)+40);
  33.                 list.add(s2);
  34.                 Student s3 = new Student("王五",3);
  35.                 s3.setChinese(random.nextInt(61)+40);
  36.                 s3.setMath(random.nextInt(61)+40);
  37.                 s3.setEnglish(random.nextInt(61)+40);
  38.                 list.add(s3);
  39.                
  40.                 //对list中的Student对象按照总分降序排序
  41.                 Collections.sort(list, new Comparator<Student>(){
  42.                         public int compare(Student o1, Student o2) {
  43.                                 int i = o2.getSum().compareTo(o1.getSum());
  44.                                 if(i == 0)        //总分相同时,按姓名升序排序
  45.                                         return o1.getName().compareTo(o2.getName());
  46.                                 return i;
  47.                         }
  48.                 });
  49.                 //打印出学生信息
  50.                 System.out.println("姓名\t"+"学号\t"+"总分\t"+"语文\t"+"数学\t"+"英语\t");
  51.                 for(Student s:list){
  52.                         System.out.println(s);
  53.                 }
  54.         }
  55. }
  56. class Student {
  57.         private String name;
  58.         private int id;
  59.         private double chinese;
  60.         private double math;
  61.         private double english;
  62.         //构造方法
  63.         public Student(String name,int id){
  64.                 this.name = name;
  65.                 this.id = id;
  66.         }
  67.         //获取总成绩的方法
  68.         public Double getSum(){
  69.                 return chinese+math+english;
  70.         }
  71.         //重写toString方法
  72.         @Override
  73.         public String toString() {
  74.                 return name+"\t"+id+"\t"+getSum()+"\t"+chinese+"\t"+math+"\t"+english;
  75.         }
  76.         //getter、setter
  77.         public String getName() {
  78.                 return name;
  79.         }
  80.         public void setName(String name) {
  81.                 this.name = name;
  82.         }
  83.         public int getId() {
  84.                 return id;
  85.         }
  86.         public void setId(int id) {
  87.                 this.id = id;
  88.         }
  89.         public double getChinese() {
  90.                 return chinese;
  91.         }
  92.         public void setChinese(double chinese) {
  93.                 this.chinese = chinese;
  94.         }
  95.         public double getMath() {
  96.                 return math;
  97.         }
  98.         public void setMath(double math) {
  99.                 this.math = math;
  100.         }
  101.         public double getEnglish() {
  102.                 return english;
  103.         }
  104.         public void setEnglish(double english) {
  105.                 this.english = english;
  106.         }
  107. }
复制代码

作者: 邵震    时间: 2013-4-1 12:31
我擦  超崩溃

哥们 你能单独发一下你的需求吗

你这个我完全看不懂 但是我知道你肯定有重复的代码
作者: 山西_李帅    时间: 2013-4-1 13:06
王亚东 发表于 2013-4-1 12:30
排序时不可以改变原来的对象,我写的不知道你有没有学到,应该正规些:

这改变的是引用呐
作者: 山西_李帅    时间: 2013-4-1 13:07
邵震 发表于 2013-4-1 12:31
我擦  超崩溃

哥们 你能单独发一下你的需求吗

对啊 , 你看我第二遍发的。   就是修改了以后的,但是还有重复代码。  哭啊!!!
作者: 黄小贝    时间: 2013-4-1 17:06
王亚东 发表于 2013-4-1 12:30
排序时不可以改变原来的对象,我写的不知道你有没有学到,应该正规些:

重复代码主要在main里面,你看下我改的吧,最开始我重构是这样的




然后我觉得实在没有办法了,只能改变排序的办法了,于是我实现了Comparable接口







还有一个重构的小细节




完整代码如下
  1. import java.util.ArrayList;
  2. import java.util.Collections;
  3. import java.util.List;

  4. /*
  5. 三个学生英语,数学,语文成绩,总成绩排序输出

  6. 分析:
  7. 1. 创建一个学生类有姓名和学号的属性 private.
  8. 设置姓名和属性的set、get方法.
  9. sum方法——求总成绩,并进行排序
  10. 2. 主函数.
  11. 1,设置姓名学号
  12. 2, 获取成绩的随机数
  13. 3, 求总成绩,并进行排序
  14. 3. 调用print方法



  15. */

  16. public class Test1 {
  17.        
  18.         public static void main(String[] args) throws CloneNotSupportedException {
  19.                
  20.                 List<Person> persons = new ArrayList<Person>();

  21.                 Person p1 = new Person("张三",1);
  22.                 Person p2 = new Person("李四",2);
  23.                 Person p3 = new Person("王五",3);
  24.                
  25.                 persons.add(p1);
  26.                 persons.add(p2);
  27.                 persons.add(p3);
  28.                
  29.                 getGrades(p1);
  30.                 getGrades(p2);
  31.                 getGrades(p3);
  32.                
  33.                 Collections.sort(persons);

  34.                 System.out.println(persons);

  35.         }

  36.         private static void getGrades(Person p1) {
  37.                 p1.english();
  38.                 p1.chinese();
  39.                 p1.math();
  40.         }
  41. }
复制代码
  1. import java.util.Random;

  2. public class Person implements Comparable{
  3.        
  4.         private String name; // 成员属性——姓名
  5.         private int id; // 成员属性——学号
  6.         int english; // 成员属性——英语成绩
  7.         int math; // 成员属性——数学成绩
  8.         int chinese; // 成员属性——语文成绩
  9.         int sum; // 成员属性——总成绩

  10.         // 无参构造函数
  11.         Person() {

  12.         }

  13.         // 有参构造函数
  14.         Person(String name, int id) {
  15.                 this.name = name;
  16.                 this.id = id;
  17.         }

  18.         // 姓名的set方法
  19.         public void setName(String name) {
  20.                 this.name = name;
  21.         }

  22.         // 学号的set方法
  23.         public void setId(int id) {
  24.                 this.id = id;
  25.         }

  26.         // 姓名的get方法
  27.         public String getName() {
  28.                 return name;
  29.         }

  30.         // 学号的get方法
  31.         public int getId() {
  32.                 return id;
  33.         }

  34.         // 总成绩sum方法
  35.         public int sum() {
  36.                 return sum = english + math + chinese;
  37.         }

  38.         // 返回英语成绩值english方法
  39.         public int english() {
  40.                 return english = getGrades();
  41.         }

  42.         // 返回数学成绩值math方法
  43.         public int math() {
  44.                 return math = getGrades();
  45.         }

  46.         // 返回语文成绩值chinese方法
  47.         public int chinese() {
  48.                 return chinese = getGrades();
  49.         }
  50.        
  51.         private int getGrades() {
  52.                 Random ran = new Random();
  53.                 return ran.nextInt(61) + 40;
  54.         }
  55.        
  56.         // 显示姓名,学号,成绩print方法
  57.         public String toString() {
  58.                 return "姓名:" + getName() + "  学号:" + getId() + "  英语:"
  59.                                 + english + "  数学:" + math + "  语文:" + chinese + "   总成绩:"
  60.                                 + sum() + "\n";
  61.         }

  62.         @Override
  63.         public int compareTo(Object o) {
  64.                 if(this.sum() > ((Person) o).sum()){
  65.                         return -1;
  66.                 }
  67.                 if(this.sum() < ((Person) o).sum()){
  68.                         return 1;
  69.                 }
  70.                 return 0;
  71.         }

  72. }
复制代码

作者: 王亚东    时间: 2013-4-1 17:36
黄小贝 发表于 2013-4-1 17:06
重复代码主要在main里面,你看下我改的吧,最开始我重构是这样的

从技术角度来说,你这样抽取不错,很简洁,但是从面向对象的方面考虑,这样就不理想了,每个学生的成绩是要传递进去的,这个随机只是为了测试方便,还有一个细节,各个成绩最好使用double,java作为一个扩展性很强的语言,考虑到成绩需要求平均分等,使用double可提高程序的扩展性,也符合生活中的实际情况
   其实说这么多,只是大家一起学习交流,提高自我的编程认识
作者: 黄小贝    时间: 2013-4-1 17:42
王亚东 发表于 2013-4-1 17:36
从技术角度来说,你这样抽取不错,很简洁,但是从面向对象的方面考虑,这样就不理想了,每个学生的成绩是 ...

我实在想尽量不改变撸主源码的情况下重构,我这样搞都觉得改多了~~练手的小东西不要在意这些细节。。。

作者: 陈圳    时间: 2013-4-1 17:58
  1. package exercises;

  2. import java.util.Arrays;
  3. import java.util.Set;
  4. import java.util.TreeSet;

  5. public class StudentSort {

  6.         /**  三个学生英语,数学,语文成绩,总成绩排序输出
  7.          * @param args
  8.          */
  9.         public static void main(String[] args) {
  10.                 // TODO Auto-generated method stub
  11.                 Set<Student> student=new TreeSet<Student>();
  12.                 student.add(new Student("张三","A101",58,78,23));
  13.                 student.add(new Student("李四","A102",38,38,53));
  14.                 student.add(new Student("王五","B103",18,98,73));
  15.                 System.out.println(student);
  16.         }

  17. }
  18. class Student implements Comparable<Student>{
  19.         private String name;
  20.         private String num;
  21.         private int score[]=new int[3];
  22.        
  23.         public Student(String name, String num, int... socre) {
  24.                 super();
  25.                 this.name = name;
  26.                 this.num = num;
  27.                 this.score = socre;
  28.         }
  29.         @Override
  30.         public int compareTo(Student s) {
  31.                 int sumScore1=0;
  32.                 int sumScore2=0;
  33.                 for(int i=0;i<this.score.length;i++){
  34.                         sumScore1+=this.score[i];
  35.                         sumScore2+=s.score[i];
  36.                 }
  37.                 //这里测试一下成绩,顺便看一下结果
  38.                 System.out.println("姓名:"+this.name+"总成绩为:"+sumScore1);
  39.                 System.out.println("姓名:"+s.name+"总成绩为:"+sumScore2);
  40.                 return sumScore2-sumScore1;//这里就不比较俩个人分数一样按名称字称字典排序了
  41.         }
  42.         @Override
  43.         public String toString(){
  44.                 return "学生:"+name+" 学号:"+num+" 语文:"+Arrays.toString(score);
  45.         }
  46. }
复制代码





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