调用几乎相同的功能

时间:2017-09-23 02:00:40

标签: java function parameters repeat

enter image description here

我正在制作上面的打印明星功能。

我解决了它,但我徘徊,我可以使我的代码更有效率。

在我的班上,我总共有4个功能。

  1. printFullstar
  2. printHollowstar
  3. printstarline1
  4. printstarline2
  5. 函数1.printFullstar2.printHollowstar 具有完全相同的结构,除了他们分别调用函数3.printstarline14.printstarline2

    我想知道我是否可以:1,2对一个函数进行操作,只需给参数调用3.printstarline14.printstarline2

    ![在此输入图片说明] [2]

            System.out.println("(i)");
            printFullstar(input);
            System.out.println("(ii)");
            printHollowstar(input);
    
            /*
             * How do I utilize or pass BiFunction as an argument? int i = 0;
             * System.out.println("test1"); printS(input, new BiFunction<Integer,
             * Integer, Void>() );
             */
    
        }
    
    
        // longest width of star = input
        // shortest width of star  (double) input>2
        public static void printFullstar(int input) {
    
            int middle = 0;
    
            // when input is odd
            if (input % 2 == 1) {
    
                middle = 1;
    
                // the top part, let's print from 1 to longest(input) -- 1 5 9 3 7 11
                for (int i = 1; i <= input; i += 4) {
                    printStarline1(i, input);
                    if (i + 2 == input) {
                        printStarline1(input, input);
                        middle = i;
                    }
                    if (i + 4 == input)
                        middle = i;
                }
    
                // the first middle part
                // let's print from second longest line to shortest (>input/2)
                for (int i = middle;; i -= 4) {
                    printStarline1(i, input);
                    if (i - 4 < (double) input / 2) {
                        middle = i; // the shortest line
                        break;
                    }
                }
                // the second middle part
                for (int i = middle + 4; i < input; i += 4) {
                    printStarline1(i, input);
                    middle = i;
                }
    
                // the bottom part, let's print from the longest line to 1
                for (int i = middle; i >= 1; i -= 4) {
                    if (i + 2 == input || i + 4 == input)
                        printStarline1(input, input);
                    printStarline1(i, input);
                }
    
            }//input odd end
    
            // when input is even
            if (input % 2 == 0) {
    
                middle = 2;
    
                // the top part, let's print from 2 to longest(input) 
                for (int i = 2; i <= input; i += 4) {
                    printStarline1(i, input);
                    if (i + 2 == input) {
                        printStarline1(input, input);
                        middle = i;
                    }
                    if (i + 4 == input)
                        middle = i;
                }
    
                // the first middle part
                // let's print from second longest line to shortest (>input/2)
                for (int i = middle;; i -= 4) {
                    printStarline1(i, input);
                    if (i - 4 < (double) input / 2) {
                        middle = i; // the shortest line
                        break;
                    }
                }
                // the second middle part
                for (int i = middle + 4; i < input; i += 4) {
                    printStarline1(i, input);
                    middle = i;
                }
    
                // the bottom part, let's print from the longest line to 2
                for (int i = middle; i >= 2; i -= 4) {
                    if (i + 2 == input || i + 4 == input)
                        printStarline1(input, input);
                    printStarline1(i, input);
                }
    
            }//input even end
    
        }//print fullstar end
    
        // same as printFullstar() but use printStarline2
        public static void printHollowstar(int input) {
    
            int middle = 0;
    
            // when input is odd
            if (input % 2 == 1) {
    
                middle = 1;
    
                // the top part, let's print from 1 to longest(input) -- 1 5 9 3 7 11
                for (int i = 1; i <= input; i += 4) {
                    printStarline2(i, input);
                    if (i + 2 == input) {
                        printStarline2(input, input);
                        middle = i;
                    }
                    if (i + 4 == input)
                        middle = i;
                }
    
                // the first middle part
                // let's print from second longest line to shortest (>input/2)
                for (int i = middle;; i -= 4) {
                    printStarline2(i, input);
                    if (i - 4 < (double) input / 2) {
                        middle = i; // the shortest line
                        break;
                    }
                }
                // the second middle part
                for (int i = middle + 4; i < input; i += 4) {
                    printStarline2(i, input);
                    middle = i;
                }
    
                // the bottom part, let's print from the longest line to 1
                for (int i = middle; i >= 1; i -= 4) {
                    if (i + 2 == input || i + 4 == input)
                        printStarline2(input, input);
                    printStarline2(i, input);
                }
    
            }//input odd end
    
            // when input is even
            if (input % 2 == 0) {
    
                middle = 2;
    
                // the top part, let's print from 2 to longest(input) 
                for (int i = 2; i <= input; i += 4) {
                    printStarline2(i, input);
                    if (i + 2 == input) {
                        printStarline2(input, input);
                        middle = i;
                    }
                    if (i + 4 == input)
                        middle = i;
                }
    
                // the first middle part
                // let's print from second longest line to shortest (>input/2)
                for (int i = middle;; i -= 4) {
                    printStarline2(i, input);
                    if (i - 4 < (double) input / 2) {
                        middle = i; // the shortest line
                        break;
                    }
                }
                // the second middle part
                for (int i = middle + 4; i < input; i += 4) {
                    printStarline2(i, input);
                    middle = i;
                }
    
                // the bottom part, let's print from the longest line to 2
                for (int i = middle; i >= 2; i -= 4) {
                    if (i + 2 == input || i + 4 == input)
                        printStarline2(input, input);
                    printStarline2(i, input);
                }
    
            }//input even end
        }
    
    }
    

2 个答案:

答案 0 :(得分:0)

通过使用接口,您可以更加简单地使用此代码。

1。)首先创建界面调用 printBehaviour

public  interface  PrintBehavious  {

    public  void printStarline(int num, int input);
}

2。)创建两个类来覆盖printStarline方法并实现printBehaviour接口并继承printStar类:    - &GT; print1:

public class print1 extends PrintStar implements PrintBehavious{

    @Override
    public void printStarline(int num, int input) {

        int blank = (input - num) / 2;
        for (int i = 1; i <= blank; i++) {
            System.out.print(" ");
        }

        // except the top and bottom there should be two *
        System.out.print("*");
        if (num > 1) {
            for (int i = 1; i <= num - 2; i++) {
                System.out.print(" ");
            }
            System.out.print("*");
        }

        for (int i = 1; i <= blank; i++) {
            System.out.print(" ");
        }
        System.out.println("");

    }


    }
--> print2 : 
public class print2  extends  PrintStar implements PrintBehavious{
    @Override
    public void printStarline(int num, int input) {

        int blank = (input - num) / 2;
        for (int i = 1; i <= blank; i++) {
            System.out.print(" ");
        }
        for (int i = 1; i <= num; i++) {
            System.out.print("*");
        }
        for (int i = 1; i <= blank; i++) {
            System.out.print(" ");
        }
        System.out.println("");
    }




}

3)创建打印界面:

public interface Print  {

      public  void printHollowstar(int input);

}

4)。创建PrintStar类并实现Print界面和printBehaviour界面:

public   class PrintStar   implements Print , PrintBehavious{

    @Override
    public void printHollowstar(int input) {

        int middle = 0;
        // when input is odd
        if (input % 2 == 1) {
            middle = 1;
            // the top part, let's print from 1 to longest(input) -- 1 5 9 3 7 11
            for (int i = 1; i <= input; i += 4) {
                printStarline(i, input);
                if (i + 2 == input) {
                    printStarline(input, input);
                    middle = i;
                }
                if (i + 4 == input)
                    middle = i;
            }

            // the first middle part
            // let's print from second longest line to shortest (>input/2)
            for (int i = middle;; i -= 4) {
                printStarline(i, input);
                if (i - 4 < (double) input / 2) {
                    middle = i; // the shortest line
                    break;
                }
            }
            // the second middle part
            for (int i = middle + 4; i < input; i += 4) {
                printStarline(i, input);
                middle = i;
            }

            // the bottom part, let's print from the longest line to 1
            for (int i = middle; i >= 1; i -= 4) {
                if (i + 2 == input || i + 4 == input)
                    printStarline(input, input);
                printStarline(i, input);
            }

        }//input odd end

        // when input is even
        if (input % 2 == 0) {

            middle = 2;

            // the top part, let's print from 2 to longest(input) 
            for (int i = 2; i <= input; i += 4) {
                printStarline(i, input);
                if (i + 2 == input) {
                    printStarline(input, input);
                    middle = i;
                }
                if (i + 4 == input)
                    middle = i;
            }

            // the first middle part
            // let's print from second longest line to shortest (>input/2)
            for (int i = middle;; i -= 4) {
                printStarline(i, input);
                if (i - 4 < (double) input / 2) {
                    middle = i; // the shortest line
                    break;
                }
            }
            // the second middle part
            for (int i = middle + 4; i < input; i += 4) {
                printStarline(i, input);
                middle = i;
            }

            // the bottom part, let's print from the longest line to 2
            for (int i = middle; i >= 2; i -= 4) {
                if (i + 2 == input || i + 4 == input)
                printStarline(input, input);
                printStarline(i, input);
            }

        }//input even end

    }

    @Override
    public void printStarline(int num, int input) {
        // TODO Auto-generated method stub

    }
}

05)并创建一个主类并打印它我没有导入扫描仪或任何用户导入,如果你需要你可以做到:

public class Assignment1_1 {

    public static void main(String[] args) {
        print1 l =  new print1();
        l.printHollowstar(3);

        print2 p =  new print2();
        p.printHollowstar(3);


    }

}

我没有使用正确的命名只是一个演示代码,所以如果你需要任何澄清回复我。谢谢,我认为这样可以正常工作

答案 1 :(得分:0)

您可以使用布尔值或枚举来实现它。因为我们希望代码对人类可读,所以让我们使用枚举。

声明开始类型的枚举:

enum StarType {
  FULL, HOLLOW
}

现在,让printFullstar(int input)printHollowstar(int input)接受枚举变量作为参数:

public static void (int input, StarType starType) {
  ...
}

public static void printHollowstar(int input, StarType starType) {
  ...
}

两种方法都接收相同的参数,因此我们可以通过创建方法来简化它们:

public static void printStar(int input, StarType starType) {
  ...
} 

现在我们有一个打印开头的通用方法。让我们简化身体方法。

从您的代码中,我们发现调用printStarline2(i, input)printStarline(i, input)时唯一不同的是名称。两者都接收相同的参数。因此,我们可以创建一个方法来选择StarType打印哪个星。这里我们使用之前的StarType枚举。创建一个接收StarType作为参数的方法,如下所示:

private static void printStarline(i,input,StarType starType){    ... }

您可以通过添加用于检查StarType的代码来确定使用哪种方法:

private static void printStarline(i, input, StarType starType) {
   if(starType == StarType.FULL) {
     printStarline(i, input);
   } else if(starType == StarType.HOLLOW) {
     printStarline2(i, input);
   }
}

现在,您可以将printStarline2(i, input)printStarline(i, input)更改为printStarline(i, input, StarType starType)

最后,您可以使用以下代码:

System.out.println("(i)");
printFullstar(input);
printStar(input, StarType.FULL)
System.out.println("(ii)");
printStar(input, StarType.HOLLOW);