如何在Java中打印2d锯齿状数组周围的边界



我需要在像下面这样的2d锯齿状阵列周围放置一个边界:

{' ', ' ', ' '}
{' ', ' ', ' '}
{' ', ' ', ' ', ' '}
{' ', ' ', ' ', ' '}
{' ', ' ', ' ', ' ', ' '}

打印如下所示的内容:

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

我想我从最上面一排开始:

for (int i = 0; i < a.length; i++) {
System.out.print('*');          
}

但我对此感到困惑(如果这是正确的话(。如何在数组的维度之间打印?

感谢

我们可以通过打印顶部边框,然后打印中间内容,最后打印底部边框来处理此问题。这里的诀窍是,我们实际上不必担心超出数组的索引。对于模式的中间部分,我们只需迭代数组的边界,并在两侧附加一个边界。除了第一个和最后一个锯齿状1D数组的大小之外,顶部和底部边界实际上并不涉及数组内容。

for (int i=0; i <= array[0].length + 1; ++i) {
System.out.print("*");
}
System.out.println();
for (int r=0; r < array.length; ++r) {
System.out.print("*");
for (int c=0; c < array[r].length; ++c) {
System.out.print(array[r][c]);
}
System.out.println("*");
}
for (int i=0; i <= array[array.length-1].length + 1; ++i) {
System.out.print("*");
}
*****
*   *
*   *
*    *
*    *
*     *
*******

我将从构建单行的方法开始。这可以用StringBuilder来完成。从一个*开始,添加所有作为输入传入的字符,并在末尾添加另一个*。将其作为String返回。比如

public static String oneLine(char[] ch) {
StringBuilder sb = new StringBuilder();
sb.append("*");
sb.append(Stream.of(ch).map(String::valueOf).collect(Collectors.joining("")));
sb.append("*");
return sb.toString();
}

然后我们可以调用它来构建所有的线路。轮廓可以通过复制第一个和最后一个条目来构建(所有空间都是星形的(。比如

char[][] arr = { { ' ', ' ', ' ' }, { ' ', ' ', ' ' }, { ' ', ' ', ' ', ' ' }, 
{ ' ', ' ', ' ', ' ' }, { ' ', ' ', ' ', ' ', ' ' } };
System.out.println(oneLine(arr[0]).replace(' ', '*'));
for (char[] ch : arr) {
System.out.println(oneLine(ch));
}
System.out.println(oneLine(arr[arr.length - 1]).replace(' ', '*'));

输出(按要求(

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

最新更新