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
相关产品推荐
相关产品推荐

