黑马程序员技术交流社区

标题: 求优化代码? [打印本页]

作者: HM刘俊    时间: 2013-4-8 22:19
标题: 求优化代码?
本帖最后由 HM刘俊 于 2013-4-9 08:26 编辑

  下面是我刚刚用for嵌套循环写的圣诞树代码。代码太多,求优化。
  1. class Tree{
  2. public static void main(String[] args){
  3. int le=10; //第一层
  4. for(int i=0;i<le;i++){
  5. for(int j=0;j<le-i-1;j++){
  6. System.out.print(" ");
  7. }
  8. for(int j=0;j<=i;j++){
  9. System.out.print("* ");
  10. }
  11. System.out.println();
  12. }
  13. int l=8; //第二层
  14. for(int a=0;a<l;a++){
  15. for(int s=0;s<l-a+1;s++){
  16. System.out.print(" ");
  17. }
  18. for(int s=0;s<=a;s++){
  19. System.out.print("* ");
  20. }
  21. System.out.println();
  22. }
  23. int q=6; //第三层
  24. for(int w=0;w<q;w++){
  25. for(int e=0;e<q-w+3;e++){
  26. System.out.print(" ");
  27. }
  28. for(int e=0;e<=w;e++){
  29. System.out.print("* ");
  30. }
  31. System.out.println();
  32. }
  33. for(int m=0;m<6;m++){ //底层
  34. System.out.print(" ");
  35. for(int n=0;n<5;n++){
  36. System.out.print("*");
  37. }
  38. System.out.println();
  39. }
  40. }
  41. }
复制代码

tree.jpg (21.88 KB, 下载次数: 5)

传说中的圣诞树

传说中的圣诞树

作者: 丘凤光    时间: 2013-4-9 01:08
本帖最后由 丘凤光 于 2013-4-9 01:17 编辑

弄了老久,这样应该差不多了吧.。能封装的都尽量封装了,最主要的是数的大小可控制,树冠层数可以控制,只要改 num=10,level=3,chang=6;就行。
  1. /*
  2. 需求:简化打印树形的代码
  3. */
  4. import static java.lang.System.*;
  5. class Tree
  6. {
  7.         private static int num=10,level=3,chang=6;        //控制打印树的大小与形状的变量
  8.         public static void main(String[] args)
  9.         {
  10.                 for(int i=1;i<=level;i++)
  11.                         san(i);
  12.                 ju();
  13.         }
  14.         //打印三角形
  15.         public static void san(int p)
  16.         {
  17.                 for(int i=0;i<num;i++)
  18.                 {
  19.                         myFor(num+2*p-i-3," ");//num+2*p-i-3为左边打印的空格数
  20.                         myFor(i,"* ");
  21.                         sop("\n");
  22.                 }
  23.                 num-=2;
  24.         }
  25.         //打印矩形
  26.         public static void ju()
  27.         {
  28.                 for(int m=0;m<chang;m++)
  29.                 {
  30.                         myFor(chang," ");
  31.                         myFor(chang,"*");
  32.                         sop("\n");
  33.                 }
  34.         }
  35.         //for循环
  36.         public static void myFor(int x,Object y)
  37.         {
  38.                 for(int i=0;i<=x;i++)
  39.                 {
  40.                         sop(y);
  41.                 }
  42.         }
  43.         //打印
  44.         public static void sop(Object obj)
  45.         {
  46.                 out.print(obj);
  47.         }
  48. }
复制代码

作者: 赵家阳    时间: 2013-4-9 04:27
本帖最后由 赵家阳 于 2013-4-9 04:33 编辑
  1. 基本实现了能动态打印树,可根据自己想要的结果打印,但只能倒着打印。
  2. 树干不太容易控制,但基本还能看。

  3. <div class="blockcode"><blockquote>import java.util.ArrayList;
  4. class Tree{
  5.         private static ArrayList<Integer> al = new ArrayList<Integer>();
  6.         /*
  7.          * 用一个集合记录每次打印树尖的位置,主要是要用第一次打印的位置
  8.          */
  9.         public static void main(String[] args){
  10.                 printTree(8);
  11.                 printTree(6);
  12.                 printGan(6);
  13.         }
  14.         public static void printTree(int e){
  15.                 for(int i=0;i<e;i++){
  16.                         if(al.size()==0){        //al.size()==0,表示是第一次打印树
  17.                                 for(int j=0;j<e-i-1;j++){
  18.                                         System.out.print(" ");
  19.                                 }
  20.                         }else{ //如果不是第一次打印,那么就根据第一次打印树的位置来判断这次需要多少空格
  21.                                 int a = al.get(0)-e;
  22.                                 for(int j=0;j<e-i-1+a;j++){
  23.                                         System.out.print(" ");
  24.                                 }
  25.                         }
  26.                         for(int j=0;j<=i;j++){
  27.                                 System.out.print("* ");
  28.                         }
  29.                         System.out.println();
  30.                 }
  31.                 al.add(e);                //记录该次打印树尖的位置
  32.         }
  33.         public static void printGan(int k){
  34.                 int j = al.get(0) - (k/2);
  35.                 for(int m=0;m<k;m++){ //底层
  36.                        
  37.                         for(int i=0;i<j;i++){        //控制树干前面打印的空格数
  38.                                 System.out.print(" ");
  39.                         }
  40.                        
  41.                         for(int n=0;n<k;n++){
  42.                                 System.out.print("*");
  43.                         }
  44.                         System.out.println();
  45.                 }
  46.         }
  47. }
复制代码

]58O{1GVL(2%N~Y4KHDGHTS.jpg (17.03 KB, 下载次数: 6)

]58O{1GVL(2%N~Y4KHDGHTS.jpg

作者: 黄小贝    时间: 2013-4-9 04:29
本帖最后由 黄小贝 于 2013-4-9 04:32 编辑

咳咳,让专业的来,我点评一下,撸主这完全是C代码的风格,可能是收了某高校谭姓教授的书籍的印象,变量的命令各种a,b,c的这样取,这样在java里面是不科学的,光少的写法单纯使用了extract method的重构办法,虽然一定程度改善了代码,但是感觉还是有些欠妥~阳少的那几个if条件语句让我有一种淡淡的忧伤~~

我下面的这种是面向对象的常规思维~~

  1. public class Tree {

  2. public static void main(String[] args) {

  3. Triangle triangle1 = new Triangle(10,-1);
  4. Triangle triangle2 = new Triangle(8,1);
  5. Triangle triangle3 = new Triangle(6,3);
  6. Rectangle rectangle = new Rectangle(6,5);

  7. triangle1.show();
  8. triangle2.show();
  9. triangle3.show();
  10. rectangle.show();
  11. }
  12. }

  13. class Triangle{

  14. private int size;
  15. private int len;//为了对齐的偏移量,应该有某种数学规律,但是我没有总结出来,就穿死数字进去吧

  16. public Triangle(int size, int len) {
  17. this.size = size;
  18. this.len = len;
  19. }

  20. public void setLevel(int size) {
  21. this.size = size;
  22. }

  23. public void show() {

  24. for (int i = 0; i < this.size; i++) {

  25. for (int j = 0; j < this.size - i + len; j++) {
  26. System.out.print(" ");
  27. }
  28. for (int j = 0; j <= i; j++) {
  29. System.out.print("* ");
  30. }
  31. System.out.println();
  32. }

  33. }
  34. }

  35. class Rectangle{

  36. private int with;
  37. private int height;

  38. public Rectangle(int with, int height) {
  39. this.with = with;
  40. this.height = height;
  41. }

  42. public void show(){

  43. for (int i = 0; i < height; i++) { // 底层
  44. System.out.print(" ");
  45. for (int j = 0; j < with; j++) {
  46. System.out.print("*");
  47. }
  48. System.out.println();
  49. }
  50. }

  51. }
复制代码
这里我插一句,我对于毕老师的关于抽取的System.out.println()方法的做法持保留态度,这样做的优点是可以少写几个字母,可是~~那是你以为~~~~

如果你使用的是eclipse系列的神器的话,手打 sys 然后Alt+/



你会发现我们也只要打三个字母,而且还不影响程序可读性~~

作者: HM刘俊    时间: 2013-4-9 08:30
丘凤光 发表于 2013-4-9 01:08
弄了老久,这样应该差不多了吧.。能封装的都尽量封装了,最主要的是数的大小可控制,树冠层数可以控制,只 ...

谢谢哈,看起来,舒服多了。
作者: HM刘俊    时间: 2013-4-9 08:39
黄小贝 发表于 2013-4-9 04:29
咳咳,让专业的来,我点评一下,撸主这完全是C代码的风格,可能是收了某高校谭姓教授的书籍的印象,变量的 ...

谢谢。还有,你起来的好早啊。
作者: HM刘俊    时间: 2013-4-9 08:40
赵家阳 发表于 2013-4-9 04:27

思路很清晰, 谢了。
作者: 刘胜寒    时间: 2013-4-9 09:57
叼炸了........
作者: 刘胜寒    时间: 2013-4-9 10:33
给你奉上代码
  1. public class ChristmasTree {

  2.         public static void main(String[] args)
  3.         {
  4.                 printTree(6,10,0);
  5.                 printTree(8,10,2);
  6.                 printTree(10,10,4);
  7.                 printlRec(10,10);
  8.         }
  9.         public static void printTree(int rol,int offset,int Init)
  10.         {
  11.                 for(int i=0;i<rol;i++)
  12.                 {
  13.                         if(i<Init) continue;
  14.                         for(int j=0;j<offset-i;j++)
  15.                         {
  16.                                 System.out.print(" ");
  17.                         }
  18.                         for(int j=0;j<=i;j++)
  19.                         {
  20.                                 System.out.print("* ");
  21.                         }
  22.                         System.out.println();
  23.                 }
  24.         }
  25.         public static void printlRec(int rol,int offset)
  26.         {
  27.                 for(int i=0;i<rol/2;i++)
  28.                 {
  29.                         for(int j=0;j<rol/2*1.5;j++)
  30.                         {
  31.                                 System.out.print(' ');
  32.                         }
  33.                         for(int j=0;j<rol/2;j++)
  34.                         {
  35.                                 System.out.print("*");
  36.                         }
  37.                         System.out.println();
  38.                 }
  39.         }
  40. }
复制代码
我就不给你注释解释了哈哈 ....

`VGEJ@LB5]OM@0CEOPB7CS8.jpg (45.93 KB, 下载次数: 2)

`VGEJ@LB5]OM@0CEOPB7CS8.jpg

作者: 刘胜寒    时间: 2013-4-9 10:36
  1. class Print
  2. {
  3.         public static void printTree(int rol,int offset,int Init)
  4.         {
  5.                 for(int i=0;i<rol;i++)
  6.                 {
  7.                         if(i<Init) continue;
  8.                         for(int j=0;j<offset-i;j++)
  9.                         {
  10.                                 System.out.print(" ");
  11.                         }
  12.                         for(int j=0;j<=i;j++)
  13.                         {
  14.                                 System.out.print("* ");
  15.                         }
  16.                         System.out.println();
  17.                 }
  18.         }
  19.         public static void printlRec(int rol,int offset)
  20.         {
  21.                 for(int i=0;i<rol/2;i++)
  22.                 {
  23.                         for(int j=0;j<rol/2*1.5;j++)
  24.                         {
  25.                                 System.out.print(' ');
  26.                         }
  27.                         for(int j=0;j<rol/2;j++)
  28.                         {
  29.                                 System.out.print("*");
  30.                         }
  31.                         System.out.println();
  32.                 }
  33.         }
  34. }
  35. public class ChristmasTree {

  36.         public static void main(String[] args)
  37.         {
  38.                 Print print = new Print();
  39.                 print.printTree(6,10,0);
  40.                 print.printTree(8,10,2);
  41.                 print.printTree(10,10,4);
  42.                 print.printlRec(10,10);
  43.         }
  44. }
复制代码
为了避免有c语言风格....
作者: 陈圳    时间: 2013-4-9 11:08
  1. package exercises;

  2. public class MerryTest {
  3.         public static void main(String[] args){
  4.                 triangle(10,3,5);//给定三个条件,num:打印树形的长度,cas:打印次数,cols:树体长度
  5.         }
  6.         public static void triangle(int num,int cas,int cols){//
  7.                 char spa=32;
  8.                 char star=32;
  9.                 int count=num;
  10.                 for(int c=0;c<cas;c++,num-=2){//输出树体部分
  11.                         for(int i=num,nums=count;i>0;){
  12.                                 for(int s=0;s<nums;s++)
  13.                                         System.out.print(spa);
  14.                                 for(int j=num;j>=i;j--){
  15.                                         System.out.print("*"+star);
  16.                                         if(num==6&&j==1){
  17.                                                 num=3;
  18.                                                 cas++;
  19.                                                 nums=8;//
  20.                                                 star='*';
  21.                                         }
  22.                                 }
  23.                                 System.out.println();
  24.                                 if(cas<=3){//打印三个树形,就让这些变量不改动了。
  25.                                         nums--;
  26.                                         i--;
  27.                                 }else cols--;
  28.                                 if(cols<0)//跳出条件,不然会死循环
  29.                                         return ;
  30.                         }
  31.                 }
  32.         }
  33. }//一个循环体解决,尽可能减少了循环次数。小题目就不考虑面向对向封装类了。里面涉及了较多的条件判断。有点麻烦
复制代码

作者: 赵家阳    时间: 2013-4-9 13:26
似水像火 发表于 2013-4-9 10:33
给你奉上代码我就不给你注释解释了哈哈 ....

够屌。。。。。。:lol
作者: 刘胜寒    时间: 2013-4-9 14:30
赵家阳 发表于 2013-4-9 13:26
够屌。。。。。。

献丑了....
作者: 黄小贝    时间: 2013-4-9 16:38
HM刘俊 发表于 2013-4-9 08:39
谢谢。还有,你起来的好早啊。

那时候还没有睡,我现在才起床~~~
作者: HM刘俊    时间: 2013-4-9 16:46
黄小贝 发表于 2013-4-9 16:38
那时候还没有睡,我现在才起床~~~

你这作息时间真吊。传说中的通宵啊。




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