我正在制作上面的打印明星功能。
我解决了它,但我徘徊,我可以使我的代码更有效率。
在我的班上,我总共有4个功能。
函数1.printFullstar
和2.printHollowstar
具有完全相同的结构,除了他们分别调用函数3.printstarline1
和4.printstarline2
。
我想知道我是否可以:1,2对一个函数进行操作,只需给参数调用3.printstarline1
或4.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
}
}
答案 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);