如何在同一行输出正方形与三角形?已有各自Java绘制函数
解决思路:先存储每行内容,再拼接输出
这个问题很常见——直接让两个绘图函数各自打印的话,它们都会自动换行,肯定没法在同一行显示两个图形。核心思路是先把每个图形的每一行内容生成并存储为字符串,再逐行将正方形和三角形的对应行拼接起来输出。我给你调整一下代码:
第一步:重构绘图函数,返回每行字符串列表
把原来直接打印的函数改成生成每行内容并存在列表里,这样我们就能拿到每一行的文本:
import java.util.ArrayList; import java.util.List; public class ShapePrinter { // 生成三角形的每行字符串 public static List<String> generateTriangle(int n) { List<String> triangleLines = new ArrayList<>(); int k = 2 * n - 5; // 保留你原来的空格计算逻辑 for (int i = 0; i < n; i++) { StringBuilder line = new StringBuilder(); // 添加前置空格 for (int j = 0; j < k; j++) { line.append(" "); } k = k - 1; // 添加星号部分 for (int j = 0; j <= i; j++) { line.append("* "); } triangleLines.add(line.toString()); } return triangleLines; } // 生成正方形的每行字符串 public static List<String> generateSquare(int width, int height) { List<String> squareLines = new ArrayList<>(); // 顶部边框 StringBuilder topLine = new StringBuilder(); for (int i = 0; i < height; i++) { topLine.append("* "); } squareLines.add(topLine.toString()); // 中间内容行 for (int i = 0; i < width - 2; i++) { StringBuilder middleLine = new StringBuilder(); middleLine.append("* "); for (int j = 0; j < height - 2; j++) { middleLine.append("* "); } middleLine.append("* "); squareLines.add(middleLine.toString()); } // 底部边框 StringBuilder bottomLine = new StringBuilder(); for (int i = 0; i < height; i++) { bottomLine.append("* "); } squareLines.add(bottomLine.toString()); return squareLines; }
第二步:编写合并打印的函数
这个函数会把两个图形的对应行拼接,如果其中一个图形行数更少,就补空格对齐,保证整体美观:
// 并排打印两个图形 public static void printSideBySide(List<String> squareLines, List<String> triangleLines) { // 先计算三角形的最大行宽度,用于补空格对齐 int maxTriangleWidth = 0; for (String line : triangleLines) { if (line.length() > maxTriangleWidth) { maxTriangleWidth = line.length(); } } int maxLines = Math.max(squareLines.size(), triangleLines.size()); for (int i = 0; i < maxLines; i++) { // 获取当前行的正方形内容,没有的话为空字符串 String squarePart = i < squareLines.size() ? squareLines.get(i) : ""; // 获取当前行的三角形内容,没有的话补对应长度的空格 String trianglePart; if (i < triangleLines.size()) { trianglePart = triangleLines.get(i); } else { trianglePart = " ".repeat(maxTriangleWidth); } // 拼接后打印 System.out.println(squarePart + trianglePart); } }
第三步:调用示例
在main函数里测试一下,比如生成一个5行5列的正方形和5行的三角形:
public static void main(String[] args) { List<String> square = generateSquare(5, 5); List<String> triangle = generateTriangle(5); printSideBySide(square, triangle); } }
关键说明
- 原来的函数直接用
System.out.println()会强制换行,所以必须先把每行内容存起来,才能自由拼接。 - 补空格的逻辑是为了处理两个图形行数不一致的情况,避免出现错位。
内容的提问来源于stack exchange,提问作者Z-Dog
相关产品推荐
相关产品推荐

