调用几乎相同的函数

calling almost same function

我正在制作一个像上面那样的打印星标功能。

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

在我的class中,我总共有4个函数。

  1. 打印满星
  2. 打印空心星
  3. printstarline1
  4. printstarline2

函数 1.printFullstar2.printHollowstar 具有完全相同的结构,除了它们分别调用函数 3.printstarline14.printstarline2

我想知道我是否可以将:1、2 函数转换为 1 并仅提供参数来调用 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
    }

}

您可以通过使用接口使此代码更加简单和高效。

1.) 首先创建接口调用printBehaviour

public  interface  PrintBehavious  {

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

2.) 创建两个 classes 来覆盖 printStarline 方法并实现 printBehaviour 接口并继承 printStar class : --> 打印 1 :

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 class 并实现 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) 并创建一个主 class 并打印它 我没有导入扫描仪或任何用户导入,如果你需要你可以做到:

public class Assignment1_1 {

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

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


    }

}

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

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

为开始类型声明一个枚举:

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) {
  ...
} 

现在我们有了打印开始的通用方法。让我们简化 body 方法。

从您的代码中,我们可以发现调用 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);