如何实现横向并排的星形图案?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); }
解决思路
核心问题是当前代码会先完整生成第一个星形的所有行,再生成第二个星形的所有行,导致上下排列。要实现横向并排,必须逐行拼接两个星形的对应行内容:
- 先分别生成每个星形的每一行字符串,存储到列表中;
- 遍历每一行,同时拼接第一个星形的该行内容、间隔空格、第二个星形的该行内容,再添加换行符;
- 处理行数不一致的情况(若两个星形行数不同):对缺少行的一侧补对应长度的空格,保证对齐。
另外,原代码的下半部分循环逻辑有小问题: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
相关产品推荐
相关产品推荐

