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

Java嵌套循环实现:如何将树形图案嵌入矩形边框中?

解决树形图案与边框结合的问题

你当前的问题在于两个方法都是直接向控制台打印内容,没法把树形图案的内容嵌入到边框的对应位置。要实现结合,需要先把树形的每一行内容生成并保存,再在绘制边框时将这些内容填充到边框内部的空格区域。

具体修改方案

1. 重构tree方法,生成树形的每行字符串

把原来直接打印的逻辑改成生成每行的字符串,存储到列表中,方便后续边框方法调用:

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

public class Weihnachtsbaum {
    public static void main(String[] args) {
        Scanner scan = new Scanner(System.in);
        System.out.print("Enter a number between 1 and 20: ");
        int height = scan.nextInt();

        while ((height < 1) || (height > 20)) {
            System.out.println("Number not inside parameters!");
            System.out.print("Enter a number between 1 and 20: ");
            height = scan.nextInt();
        }
        
        // 先生成树形的所有行
        List<String> treeLines = generateTree(height);
        // 绘制带树的边框
        drawFrameWithTree(height, treeLines);
    }

    // 生成树形的每行字符串,返回列表
    static List<String> generateTree(int height) {
        List<String> lines = new ArrayList<>();
        
        // 第一行:>()<
        if (height >= 1) {
            StringBuilder firstLine = new StringBuilder();
            // 计算前面的空格数,让>()<居中
            int spaceCount = height - 2;
            for (int j = 0; j < spaceCount; j++) {
                firstLine.append(" ");
            }
            firstLine.append(">()<");
            lines.add(firstLine.toString());
        }
        
        // 生成树枝部分
        for (int i = 1; i <= height; i++) {
            StringBuilder branchLine = new StringBuilder();
            // 前面的空格
            for (int space = 1; space <= height - i; space++) {
                branchLine.append(" ");
            }
            // 树枝
            for (int branch = 1; branch <= i; branch++) {
                branchLine.append("/\\");
            }
            lines.add(branchLine.toString());
        }
        
        // 树干部分(单独作为一行)
        StringBuilder trunkLine = new StringBuilder();
        for (int j = 0; j < height - 1; j++) {
            trunkLine.append(" ");
        }
        trunkLine.append("||");
        lines.add(trunkLine.toString());
        
        return lines;
    }

    // 绘制包含树形的边框
    static void drawFrameWithTree(int height, List<String> treeLines) {
        int frameRows = height + 4;
        int frameCols = height * 2 + 4;
        int innerWidth = frameCols - 2; // 去掉左右边框的|,得到内部可用宽度
        
        for (int rows = 0; rows <= frameRows; rows++) {
            for (int columns = 0; columns <= frameCols; columns++) {
                // 绘制边框四个角
                if ((rows == 0 && columns == 0) || (rows == frameRows && columns == 0) 
                    || (columns == frameCols && rows == 0) || (rows == frameRows && columns == frameCols)) {
                    System.out.print("+");
                } 
                // 绘制顶部和底部边框线
                else if (rows == 0 || rows == frameRows) {
                    System.out.print("-");
                } 
                // 绘制左右边框线
                else if (columns == 0 || columns == frameCols) {
                    System.out.print("|");
                } 
                // 内部区域填充树形内容
                else {
                    // 计算当前行对应的树形行索引:边框顶部占1行,空1行后开始放树
                    int treeLineIndex = rows - 2;
                    if (treeLineIndex >= 0 && treeLineIndex < treeLines.size()) {
                        String treeLine = treeLines.get(treeLineIndex);
                        // 计算水平偏移,让树形在边框内居中
                        int charOffset = (innerWidth - treeLine.length()) / 2;
                        int charIndex = columns - 1 - charOffset;
                        if (charIndex >= 0 && charIndex < treeLine.length()) {
                            System.out.print(treeLine.charAt(charIndex));
                        } else {
                            System.out.print(" ");
                        }
                    } else {
                        System.out.print(" ");
                    }
                }
            }
            System.out.println();
        }
    }
}

关键修改说明

  • generateTree方法:不再直接打印,而是用StringBuilder构建每一行的树形内容,存入List<String>,完整保存树形的所有行数据,为后续嵌入边框做准备。
  • drawFrameWithTree方法:接收树形的行列表,在绘制边框内部时,通过计算行索引和水平偏移量,让树形居中显示在边框内,对应位置填充树形字符,超出树形范围的区域仍填充空格。
  • 布局计算:通过计算边框内部宽度和树形每行长度的差值,实现树形在边框中的居中对齐,保证整体视觉协调。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.09 03:10:15