编写一个程序,显示(*)正方形,填充和空心,并排

时间:2018-04-29 19:18:13

标签: java loops io nested ascii-art

我目前正在尝试显示一个填充的星号正方形和一个空心星号:

********** **********
********** *        *
********** *        *
********** *        *
********** **********

相反,我得到了这个输出:

**********
**********
**********
**********
**********
**********
*        *
*        *
*        *
**********

我不太确定如何并排而不是上下。我是否必须将空心嵌套循环放在填充的循环中,或者我必须做其他事情吗?这是我的代码:

public class doubleNestedLoops {
    public static void main(String [] args)
    {
        //Filled Square
        for(int i = 1; i <= 5; i++)
        {
            for(int j=1; j<= 10; j++)
            {
                System.out.print("*");
            }
            System.out.println();
        }

        //Hollow Square
        for(int j=1; j<=5; j++)
          {  
            for(int i=1; i<=10; i++)
            {
              if(j ==1 || j==5 || i==1 || i==10)  
              {
                System.out.print("*");
              }
              else
              {
                   System.out.print(" ");
              }
            }
             System.out.println();
          } 
    }
}

抱歉格式不佳

3 个答案:

答案 0 :(得分:1)

打印一行后,您无法返回已打印的行并向其添加更多*。这意味着在为已填充的方块打印一条线之后,您无法返回到已打印的同一条线以添加空心方块的*。

解决此问题的最简单方法是稍微重新构建代码,以便不是先打印填充的正方形,然后再打印空心的正方形,而是在每行上同时打印两个。

为此,您可以将代码重构为以下内容:

//Loop through each line that needs to be printed
for(int i = 1; i <= 5; i++){

   //Loop through characters for filled square needed in this line
   for(int j=0; j< ; j++){
       //Add print logic for filled square
   }

   //Loop through characters for hollow square on the same line
   for(int j=1; j<=5; j++){
       //Add print logic for hollow square
   }

   System.out.println();//Go to next line
}

答案 1 :(得分:0)

John Martinez&#39;答案很好,但效率有点低。我会在您的代码下面一步一步地进行修改:

public class Main {
    public static void main(String[] args) {
        //Both Squares
        StringBuilder filledLine = new StringBuilder(10);
        StringBuilder hollowLine = new StringBuilder(10);
        for (int i = 1; i <= 5; i++) {
            for (int j = 1; j <= 10; j++) {
                filledLine.append("*");
                if (i == 1 || i == 5 || j == 1 || j == 10) {
                    hollowLine.append("*");
                } else {
                    hollowLine.append(" ");
                }
            }
            System.out.println(filledLine + " " + hollowLine);
            filledLine.delete(0, filledLine.length());
            hollowLine.delete(0, hollowLine.length());
        }
    }

}

步骤1:将两个循环转换为一个循环。这是因为一旦你换了一行就不能在同一行上打印。

第2步:因为我们会在循环中使用字符串,所以使用StringBuffer会更有效率,因此我们不会不断创建新字符串

步骤3:将逻辑中的所有输出写入缓冲区而不是控制台。

步骤4:在我们填充缓冲区时,一次打印一行缓冲区。

第5步:获利!

答案 2 :(得分:0)

您可以编写一种更通用的方法来打印这样的正方形:

**********  **********  **********  **********  **********  **********  **********
**********  *        *  *        *  **********  *        *  *        *  **********
**********  *        *  *        *  **********  *        *  *        *  **********
**********  *        *  *        *  **********  *        *  *        *  **********
**********  **********  **********  **********  **********  **********  **********
******** ******** ******** ******** ******** ********
*      * ******** *      * *      * ******** *      *
*      * ******** *      * *      * ******** *      *
******** ******** ******** ******** ******** ********
line1: [1, 0, 0, 1, 0, 0, 1], size: 5
line2: [0, 1, 0, 0, 1, 0], size: 4

Try it online!

正方形的被定义为一个int[]数组,其中正方形是:0 - 空心和1 - 填充。每个 square 是一个由指定的 String[] 组成的 size 数组,其中每个字符串的长度是指定的 size 的两倍。正方形按顺序彼此并排连接,它们之间具有指定的 delimiter

public static void main(String[] args) {
    int[] arr1 = {1, 0, 0, 1, 0, 0, 1};
    int[] arr2 = {0, 1, 0, 0, 1, 0};

    Arrays.stream(line(arr1, 5, "  ")).forEach(System.out::println);
    Arrays.stream(line(arr2, 4, " ")).forEach(System.out::println);

    System.out.println("line1: " + Arrays.toString(arr1) + ", size: " + 5);
    System.out.println("line2: " + Arrays.toString(arr2) + ", size: " + 4);
}
public static String[] line(int[] arr, int size, String delimiter) {
    return Arrays.stream(arr)
            // prepare a square for each number:
            // 0 - hollow and 1 - filled
            // Stream<String[]>
            .mapToObj(i -> square(size, i != 0))
            // sequentially join squares side-by-side
            // with the specified delimiter between them
            .reduce((arr1, arr2) -> IntStream.range(0, size)
                    .mapToObj(i -> arr1[i] + delimiter + arr2[i])
                    .toArray(String[]::new))
            .orElse(null);
}
public static String[] square(int size, boolean filled) {
    return IntStream.range(0, size)
            // i - height, j - width
            .mapToObj(i -> IntStream.range(0, size * 2)
                    // the filled square and the borders of the hollow
                    // square are asterisks, otherwise whitespaces
                    .mapToObj(j -> filled || i == 0 || j == 0
                            || i == size - 1 || j == size * 2 - 1 ? "*" : " ")
                    .collect(Collectors.joining()))
            .toArray(String[]::new);
}