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

如何在同一行输出正方形与三角形?已有各自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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.27 09:51:58