You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何实现横向并排的星形图案?Java代码问题求助

实现横向并排的星形图案

目标图案

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

当前错误输出

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

问题代码

public static void main(String[] args) {
    StringBuilder stringBuilder = new StringBuilder();
    test(3,stringBuilder);
    test(5,stringBuilder);
    print(stringBuilder);
}

public static void test(int n,StringBuilder stringBuilder){
    for(int i=0;i<n;i++)
    {
        for(int j=0;j<n-i-1;j++){
            stringBuilder.append(" ");
        }
        for(int k=0;k<2*i+1;k++){
            stringBuilder.append("*");
        }
        stringBuilder.append(System.getProperty("line.separator"));
    }

    for(int i=n-1;i>0;i--)
    {
        for(int j=n-1;j>=i;j--){
            stringBuilder.append(" ");
        }
        for(int k=2*i-1;k>0;k--){
            stringBuilder.append("*");
        }
        stringBuilder.append(System.getProperty("line.separator"));
    }
}

public static void print(StringBuilder stringBuilder){
    System.out.println(stringBuilder);
}

解决思路

核心问题是当前代码会先完整生成第一个星形的所有行,再生成第二个星形的所有行,导致上下排列。要实现横向并排,必须逐行拼接两个星形的对应行内容:

  1. 先分别生成每个星形的每一行字符串,存储到列表中;
  2. 遍历每一行,同时拼接第一个星形的该行内容、间隔空格、第二个星形的该行内容,再添加换行符;
  3. 处理行数不一致的情况(若两个星形行数不同):对缺少行的一侧补对应长度的空格,保证对齐。

另外,原代码的下半部分循环逻辑有小问题:for(int i=n-1;i>0;i--)会导致生成的行数少一行,正确的下半部分应该从n-2开始循环到0,确保星形对称。

修正后的代码

import java.util.ArrayList;
import java.util.List;

public class StarPattern {
    public static void main(String[] args) {
        // 生成两个星形的行列表,这里目标是两个n=3的星形,若要n=5可修改参数
        List<String> star1 = generateStar(3);
        List<String> star2 = generateStar(3);
        int maxRows = Math.max(star1.size(), star2.size());
        StringBuilder sb = new StringBuilder();
        
        // 两个星形之间的间隔空格数,可根据需求调整
        String gap = "     ";
        
        for (int i = 0; i < maxRows; i++) {
            // 获取第一个星形的当前行,超出范围则补对应长度的空格
            String line1 = i < star1.size() ? star1.get(i) : getSpaceString(star1.get(0).length());
            // 获取第二个星形的当前行,超出范围则补对应长度的空格
            String line2 = i < star2.size() ? star2.get(i) : getSpaceString(star2.get(0).length());
            
            sb.append(line1).append(gap).append(line2).append(System.lineSeparator());
        }
        
        System.out.println(sb);
    }

    // 生成单个星形的所有行,返回行列表
    public static List<String> generateStar(int n) {
        List<String> lines = new ArrayList<>();
        // 上半部分(含中间行)
        for (int i = 0; i < n; i++) {
            StringBuilder line = new StringBuilder();
            // 前置空格
            for (int j = 0; j < n - i - 1; j++) {
                line.append(" ");
            }
            // 星号
            for (int k = 0; k < 2 * i + 1; k++) {
                line.append("*");
            }
            lines.add(line.toString());
        }
        // 下半部分(对称的下半段)
        for (int i = n - 2; i >= 0; i--) {
            StringBuilder line = new StringBuilder();
            // 前置空格
            for (int j = 0; j < n - i - 1; j++) {
                line.append(" ");
            }
            // 星号
            for (int k = 0; k < 2 * i + 1; k++) {
                line.append("*");
            }
            lines.add(line.toString());
        }
        return lines;
    }

    // 生成指定长度的空格字符串
    public static String getSpaceString(int length) {
        return " ".repeat(length);
    }
}

内容的提问来源于stack exchange,提问作者Mj choi

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.09 22:31:11