我目前正在尝试显示一个填充的星号正方形和一个空心星号:
********** **********
********** * *
********** * *
********** * *
********** **********
相反,我得到了这个输出:
**********
**********
**********
**********
**********
**********
* *
* *
* *
**********
我不太确定如何并排而不是上下。我是否必须将空心嵌套循环放在填充的循环中,或者我必须做其他事情吗?这是我的代码:
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();
}
}
}
抱歉格式不佳
答案 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
正方形的行被定义为一个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);
}