增强版JAVA实现文本形式的树状结构显示

代码大纲工具开发指南:从AST解析到编辑器集成的工程实践 在软件开发中,代码的可读性与可维护性是提升开发效率的关键。抽象语法树(AST)作为源代码的树状结构表示,是实现代码静态分析、语法高亮和智能提示等高级功能的核心原理。通过解析AST,开发者可以提取代码的结构化信息,为构建高效的开发工具奠定基础。这一技术的核心价值在于将复杂的代码文本转化为可编程、可遍历的数据结构,从而支持代码导航、重构和可视化等应用场景。本文聚焦于如何利用AST解析技术,结合Tree-sitter等高效解析器,构建一个实时、可交互的代码大纲工具。该工具能显著提升在大型项目(如React、Vue 阅读详情

应网友要求,重新书写了代码,请参考使用。旧代码毅然保留,在文章的后半部

此最新代码增加了对下拉列表的输出支持,可以直接使用在<select>里面
同时可以访问父节点和兄弟节点。

package  net.java2000.tools;

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

/**
 * 树状结构的文本显示和下拉框显示。<br>
 * 转载请保留本说明,并注明出处<br>
 * www.java2000.net<br>
 * blog.youkuaiyun.com/java2000_net/
 * 
 * 
@version 2008.02.23
 * 
@author 赵学庆
 
*/

public   class  ForumFolder  {
  
// 编号
  private long id;

  
// 标题
  private String title;

  
// 下级列表
  private List<ForumFolder> children = new ArrayList<ForumFolder>();

  
// 上级,顶层为null
  private ForumFolder parent;

  
// 前一个节点
  private ForumFolder prev;

  
// 后一个节点
  private ForumFolder next;

  
// 当前处理的节点
  private ForumFolder current;

  
/**
   * 默认的构造器
   
*/

  
public ForumFolder() {
  }


  
/**
   * 推荐使用的构造器
   * 
   * 
@param id 编号
   * 
@param title 文本
   
*/

  
public ForumFolder(long id, String title) {
    
this.id = id;
    
this.title = title;
  }


  
/**
   * 增加一个下属。<br>
   * 自动对应上级和兄弟结点
   * 
   * 
@param f 被增加的节点
   
*/

  
public void addChild(ForumFolder f) {
    children.add(f);
    f.setParent(
this);
    
if (current != null) {
      current.next 
= f;
    }

    f.prev 
= current;
    current 
= f;
  }


  
/**
   * 输出为下拉列表的方法
   * 
   * 
@param selectedId 被选中的编号
   * 
@return 下拉列表的字符串。可以直接放到<select></select>里面
   
*/

  
public String getOption(long selectedId) {
    
return "<option>" + toStringOption("", "", selectedId);
  }


  
/**
   * 输出为Text的方法。<br>
   * 应网友建议,更改toString为toStringText方法。
   * 
   * 
@param lftStr 左侧额外的字符串
   * 
@param append 右侧显示的字符串
   * 
@return 文本形式的字符串
   
*/

  
public String toStringText(String lftStr, String append) {
    StringBuilder b 
= new StringBuilder();
    b.append(append 
+ title);
    b.append(
" ");
    
if (children.size() > 0) {
      
for (int i = 0; i < children.size() - 1; i++) {
        b.append(lftStr 
+ children.get(i).toStringText(lftStr + "│", "├"));
      }

      b.append(lftStr 
+ children.get(children.size() - 1).toStringText(lftStr + " ", "└"));
    }

    
return b.toString();
  }


  
public static void main(String[] args) {
    ForumFolder root 
= new ForumFolder(0, "菜单列表");
    ForumFolder f1 
= new ForumFolder(1, "开始菜单");
    root.addChild(f1);
    ForumFolder f1_1 
= new ForumFolder(11, "程序");
    f1.addChild(f1_1);
    ForumFolder f1_1_1 
= new ForumFolder(111, "附件");
    f1_1.addChild(f1_1_1);
    ForumFolder f1_1_1_1 
= new ForumFolder(1111, "娱乐");
    f1_1_1.addChild(f1_1_1_1);
    ForumFolder f1_1_1_2 
= new ForumFolder(1112, "娱乐2");
    f1_1_1.addChild(f1_1_1_2);
    ForumFolder f1_2 
= new ForumFolder(12, "辅助工具");
    f1.addChild(f1_2);
    ForumFolder f2 
= new ForumFolder(2, "My Documents ");
    root.addChild(f2);
    ForumFolder f3 
= new ForumFolder(3, "My Documents2 ");
    root.addChild(f3);
    System.out.println(root.toStringText(
" ", ""));
    System.out.println(root.getOption(
111));
    System.out.println(f1_1_1_2.getPrev().getTitle());
    System.out.println(f1_1_1_2.getPrev().getParent().getTitle());
  }


  
public List<ForumFolder> getChildren() {
    
return children;
  }


  
public long getId() {
    
return id;
  }


  
/**
   * 得到下一个兄弟结点。
   * 
   * 
@return 如果是最后一个,则返回null
   
*/

  
public ForumFolder getNext() {
    
return next;
  }


  
public ForumFolder getParent() {
    
return parent;
  }


  
/**
   * 得到前一个兄弟结点。
   * 
   * 
@return 如果是第一个,则返回null
   
*/

  
public ForumFolder getPrev() {
    
return prev;
  }


  
public String getTitle() {
    
return title;
  }


  
public void setId(long id) {
    
this.id = id;
  }


  
public void setNext(ForumFolder next) {
    
this.next = next;
  }


  
public void setParent(ForumFolder parent) {
    
this.parent = parent;
  }


  
public void setPrev(ForumFolder prev) {
    
this.prev = prev;
  }


  
public void setTitle(String title) {
    
this.title = title;
  }


  
/**
   * 构造下拉列表.
   * 
   * 
@param lftStr 左侧的字符
   * 
@param append 增加的字符
   * 
@param idSelected 被选中的编号
   * 
@return 下拉列表字符串
   
*/

  
private String toStringOption(String lftStr, String append, long idSelected) {
    StringBuilder b 
= new StringBuilder();
    b.append(append 
+ title + "</option>");
    b.append(
" ");
    
if (children.size() > 0) {
      
for (int i = 0; i < children.size() - 1; i++) {
        b.append(
"<option value='" + children.get(i).getId() + "'" + (idSelected == children.get(i).getId() ? " selected" : "")
            
+ ">" + lftStr + children.get(i).toStringOption(lftStr + "│", "├", idSelected));
      }

      b.append(
"<option value='" + children.get(children.size() - 1).getId() + "'"
          
+ (idSelected == children.get(children.size() - 1).getId() ? " selected" : "") + ">" + lftStr
          
+ children.get(children.size() - 1).toStringOption(lftStr + " ", "└", idSelected));
    }

    
return b.toString();
  }

}

运行结果如下:

菜单列表
 ├开始菜单
 │├程序
 ││└附件
 ││ ├娱乐
 ││ └娱乐2
 │└辅助工具
 ├My Documents
 └My Documents2

<option>菜单列表</option>
<option value='1'>├开始菜单</option>
<option value='11'>│├程序</option>
<option value='111' selected>││└附件</option>
<option value='1111'>││ ├娱乐</option>
<option value='1112'>││ └娱乐2</option>
<option value='12'>│└辅助工具</option>
<option value='2'>├My Documents </option>
<option value='3'>└My Documents2 </option>

娱乐
附件

原文出处: http://www.java2000.net/viewthread.jsp?tid=944

--------------------------------------------------------------------------------------------------------------------------------------------
----------------------------------------------- 以下为老版本的代码,仅供参考 -------------------------------------------------
--------------------------------------------------------------------------------------------------------------------------------------------


代码如下,可根据需求衍生出各种格式的输出和使用

package  test;

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

public   class  Folder  {
    
public Folder(String title) {
        
this.title = title;
    }


    
private String title;

    
private List<Folder> children = new ArrayList<Folder>();

    
public void addChild(Folder f) {
        children.add(f);
    }


    
public List<Folder> getChildren() {
        
return children;
    }


    
public void setChildren(List<Folder> children) {
        
this.children = children;
    }


    
public String getTitle() {
        
return title;
    }


    
public void setTitle(String title) {
        
this.title = title;
    }


    
public String toString(String lftStr, String append) {
        StringBuilder b 
= new StringBuilder();
        b.append(append 
+ title);
        b.append(
"/n");
        
if (children.size() > 0) {
            
for (int i = 0; i < children.size() - 1; i++) {
                b.append(lftStr
+children.get(i).toString(lftStr + "│", "├"));
            }

            b.append(lftStr 
+ children.get(children.size() - 1).toString(
                    lftStr 
+ " ", "└"));

        }

        
return b.toString();

    }


    
public static void main(String[] args) {
        Folder root 
= new Folder("菜单列表");
        Folder f1 
= new Folder("开始菜单");
        root.addChild(f1);
        Folder f1_1 
= new Folder("程序");
        f1.addChild(f1_1);
        Folder f1_1_1 
= new Folder("附件");
        f1_1.addChild(f1_1_1);
        Folder f1_1_1_1 
= new Folder("娱乐");
        f1_1_1.addChild(f1_1_1_1);
        Folder f1_1_1_2 
= new Folder("娱乐2");
        f1_1_1.addChild(f1_1_1_2);
        Folder f1_2 
= new Folder("辅助工具");
        f1.addChild(f1_2);
        Folder f2 
= new Folder("My Documents ");
        root.addChild(f2);
        Folder f3 
= new Folder("My Documents2 ");
        root.addChild(f3);

        System.out.println(root.toString(
" ", ""));
    }

}

 运行结果如下:

菜单列表
 ├开始菜单
 │├程序
 ││└附件
 ││ ├娱乐
 ││ └娱乐2
 │└辅助工具
 ├My Documents
 └My Documents2

应网友要求,增加了JDK 1.4版及以下的程序版本,取消了泛型

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

public   class  Folder  {
  
public Folder(String title) {
    
this.title = title;
  }


  
private String title;

  
private List children = new ArrayList();

  
public void addChild(Folder f) {
    children.add(f);
  }


  
public List getChildren() {
    
return children;
  }


  
public void setChildren(List children) {
    
this.children = children;
  }


  
public String getTitle() {
    
return title;
  }


  
public void setTitle(String title) {
    
this.title = title;
  }


  
public String toString(String lftStr, String append) {
    StringBuilder b 
= new StringBuilder();
    b.append(append 
+ title);
    b.append(
" ");
    
if (children.size() > 0) {
      
for (int i = 0; i < children.size() - 1; i++) {
        b.append(lftStr 
+ ((Folder) children.get(i)).toString(lftStr + "│", "├"));
      }

      b.append(lftStr 
+ ((Folder) children.get(children.size() - 1)).toString(lftStr + " ", "└"));
    }

    
return b.toString();
  }


  
public static void main(String[] args) {
    Folder root 
= new Folder("菜单列表");
    Folder f1 
= new Folder("开始菜单");
    root.addChild(f1);
    Folder f1_1 
= new Folder("程序");
    f1.addChild(f1_1);
    Folder f1_1_1 
= new Folder("附件");
    f1_1.addChild(f1_1_1);
    Folder f1_1_1_1 
= new Folder("娱乐");
    f1_1_1.addChild(f1_1_1_1);
    Folder f1_1_1_2 
= new Folder("娱乐2");
    f1_1_1.addChild(f1_1_1_2);
    Folder f1_2 
= new Folder("辅助工具");
    f1.addChild(f1_2);
    Folder f2 
= new Folder("My Documents ");
    root.addChild(f2);
    Folder f3 
= new Folder("My Documents2 ");
    root.addChild(f3);
    System.out.println(root.toString(
" ", ""));
  }

}

PEM证书深度解析:从Base64编码到X.509结构,掌握证书转换与编程操作 Base64编码是一种将二进制数据转换为ASCII文本的编码方案,广泛应用于数据传输与存储,以确保数据在纯文本环境中的完整性。其核心原理是将每3个字节的二进制数据编码为4个可打印字符,从而实现二进制到文本的安全转换。在信息安全领域,Base64编码是数字证书、密钥交换等场景的技术基石,它使得证书和密钥能够以文本形式嵌入配置文件、电子邮件或网页中。PEM格式正是基于Base64编码,并添加了特定的页眉页脚标签,形成了一种标准化的证书封装格式。理解PEM证书的层次结构——从文本标签到Base64编码块,再到底层 阅读详情

相关推荐

【信息科学与工程学】【安全领域】第一百四十二篇 零信任网络解决方案中的算法04

对于节点 i, 有功和无功功率平衡方程为: Pi​=Vi​∑j=1N​Vj​(Gij​cosθij​+Bij​sinθij​), Qi​=Vi​∑j=1N​Vj​(Gij​sinθij​−Bij​cosθij​)。下风向某点 (x,y,z)的浓度 C为: C=2πuσy​σz​Q​exp(−2σy2​y2​)[exp(−2σz2​(z−H)2​)+exp(−2σz2​(z+H)2​)], 其中 Q是源强, u是风速, H是有效源高, σy​,σz​是水平和垂直扩散参数。

weixin_49199313的博客 1413

【readme】生成常见的树型目录结构md文本

【代码】【readme】生成常见的树型目录结构md文本。

weixin_44002043的博客 604

Java实现文本形式的树状结构显示

Java实现文本形式的树状结构显示 Java实现文本形式的树状结构显示

用pyqt5实现一个界面树状文本界面

我们可以通过使用来管理布局,并通过动态创建新的文本框和按钮来实现这一功能。每次点击加号按钮时,都会创建新的子文本框,并在父容器的布局中进行更新。

kuixiang_yin的博客 381

具有树状结构的文本论坛beta1.5版

一、论坛具有树状结构。创建新主题的帖子成为“树干”,回复它的帖子自动成为“树枝”,而每个“树枝”被回复时又会生成新的小分支... 二、该论坛支持UBB。 三、提供主题搜索功能,可以根据主题、创建人名字、创建时间等进行搜索。 四、方便的自动注册系统。初次使用也只要求输入名字和密码,就自动注册,下次就可以用同样的密码来登录该名字。 五、管理员或发帖人可以随时修改、删除帖子。 六、该论坛支持全部的OICQ头像,一共有66个。 感兴趣的朋友可以到这个地址看看它的演示:http://youziyun.oso.com.cn/forum/forum.php

STM32实战:手把手教你移植CanFestival协议栈(附完整代码)

本文提供了一份详尽的STM32平台移植CanFestival协议栈的实战指南。文章从工程搭建、定时器驱动、CAN硬件适配到对象字典配置,手把手讲解核心步骤,并附完整代码示例。重点剖析了时间管理、报文收发等关键环节的实现与常见问题解决方案,旨在帮助开发者深入理解并成功实现CANopen通信。

kiwi8的博客 274

目录结构导出工具增强版排版文件结构神器

这篇文章介绍了一款改进版的目录结构导出工具,新增了MD和HTML格式导出功能,支持显示文件大小、修改日期等选项,并优化了用户界面。工具支持拖拽文件夹、双击快速导出,适用于文档管理、归档和分享场景。作者提供了软件成品和源码,可通过私信获取。

秋月的私语 451

Skiplist,B,B+tree,LSM tree

SkipList 理解(如何实现): 即使是有序的链表,查找的时间复杂度也是O(n),但链表不能随机访问所以不适用于二分查找,使得查找的时间复杂度为O(logn)。 于是将有序链表和二分查找结合得到了SkipList,类似于二叉搜索树,这是一种以空间换时间的算法,通过在每个节点中增加向前的指针,从而提升查找效率(如下图所示)。 一开始如a所示,是一个有序的链表,时间复杂度O(n)。随后建立了e所示的SkipList,从最顶层往下查找,可以跳过许多元素,减少查找次数。 ​

weixin_45875458的博客 948

二叉树的文本显示

二叉树的文本显示引言基本思路构造节点类添加测试窗口编写后台代码1. 构建二叉树2. 构造文本形式的树状图3. 按钮单击事件处理函数 引言 在用二叉树编程时,总希望看到二叉树的内部结构。使用各种遍历方法虽能将二叉树按某种顺序转换成一个字符串,但不太直观。如要绘成图形,又将增加不少资源开销。如能将二叉树用文本方法显示其树状结构,则既节约开销,又不失直观。本文在VS2010以WPF框架实现 基本思路 要...

jxlzw的专栏 1226

HI3516CV610海思SOC:超高清智慧视觉开发全攻略

本文全面解析海思HI3516CV610 SOC在超高清智慧视觉开发中的应用。该芯片集成双核A7处理器、1Tops NPU、AI ISP及4K视频编码器,专为智能摄像头设计。文章详细介绍了开发环境搭建、核心硬件架构、媒体处理平台(MPP)实战、AI算法集成与系统调优等全流程攻略,帮助开发者高效构建稳定可靠的视觉AI产品。

weixin_29269441的博客 1255

信创服务器(麒麟 V10 SP3)安装 NVIDIA GeForce RTX 5070 驱动

本文介绍了在麒麟V10 SP3系统上安装NVIDIA RTX 5070显卡驱动的详细步骤。首先需要关闭nouveau驱动,安装必要的编译环境和工具,确保内核版本与kernel-devel完全一致。最后运行NVIDIA驱动安装程序,关键选择包括启用DKMS支持、编译模块、禁用32位兼容和nouveau驱动。整个流程适用于海光CPU和Blackwell架构GPU的国产操作系统环境。

猿小白的博客 683

2008年老紫竹最受欢迎的20个博文

以查看次数决定,截至于2009年01月03日凌晨3119 一个能够记录你在优快云得分历史的功能3417 JAVA到底能做什么?为何实际用到的技术却很少?3552 优快云网友就寝时间调查报告4014 Java防止非法和重复表单提交的分析4127 学Java的人员和数据库专家的关系4279 增强版JAVA实现文本形式的树状结构显示4347 为什么上大学?学到了什么和建议的讨论总结4388 有感于J

老紫竹的专栏 2393

【ComfyUI】QwenImageEdit OOTD角色与姿态匹配换装

本文介绍了一个基于Qwen Edit OOTD 2.0的ComfyUI工作流,能够实现角色与姿态匹配的智能穿搭生成。该工作流通过整合模型推理、姿态识别、图像拼接和渲染等节点,完成从角色图、姿态图到成品穿搭图的完整生成流程。核心采用Qwen Image系列模型进行图像理解和编辑,配合ControlNet进行姿态引导。用户只需提供角色图和姿态参考图,系统即可自动完成姿态解析、语义编码、采样生成等步骤,输出与输入姿态一致的穿搭图像。该方案适用于虚拟角色展示、电商试穿等场景,能保持角色特征一致的同时灵活变换姿态,显

Mr数据杨 1591

Linux核心命令深度解析:从原理到实战排查

在Linux系统管理与运维中,理解命令背后的原理是提升效率的关键。Linux遵循“一切皆文件”的设计哲学,硬件、进程、网络连接等均抽象为文件,这决定了命令通过标准输入输出和文本流进行交互。掌握命令的原理,不仅能灵活运用,更能通过管道组合解决复杂问题,体现其技术价值。例如,通过`find`递归搜索、`grep`模式匹配、`awk`结构化处理,可以高效完成日志分析和故障定位。本文聚焦于Linux核心命令的深度解析,涵盖文件操作、文本处理、系统监控等高频应用场景,帮助开发者从使用层面深入到原理层面,构建系统化的知

深未来技术 339

AMBA-CHI协议详解(三)

Write Transactions、Atomic transactions、 Stash transactions、 Dataless transactions的等各个事务的事务流。

Crazzy_M的博客 3181

Flow Matching03-01:微分方程【微分方程(描述变化规律的方程):包含未知函数和它的导数的方程】【公式解(精确)、数值解(逼近)】

好的,我将从数学角度详细解释Flow Matching,从高中生能理解的基础知识开始,逐步深入到高级概念。

u013250861的博客 219

Linux命令选项深度解析:从递归到强制,掌握高频选项背后的设计哲学

在Linux系统管理与运维中,命令行是工程师的核心工具。理解命令选项(Options)的设计原理,是提升操作效率、构建系统性知识体系的基础。这些以短横线(-)或双短横线(--)开头的参数,本质上是命令功能的开关和调节器,其设计遵循着跨命令的一致性模式。例如,选项 `-r` 通常代表 `--recursive`(递归),其技术价值在于实现对目录树的深入操作,这一模式在 `cp`、`rm`、`chmod` 等多个文件操作命令中通用。另一个高频选项 `-f` 对应 `--force`(强制),它绕过了交互确认,在

weixin_34417200的博客 356

刚体转动欧拉方程:从理论到卫星姿态控制的实践

刚体转动欧拉方程是描述刚体旋转运动的基本动力学方程,在卫星姿态控制、机器人学、航空航天等领域有着广泛应用。本文将详细讲解欧拉方程的物理概念、数学推导、数值计算方法,并重点分析其在卫星姿态控制系统中的具体应用。

ScilogyHunter的博客 644

RAPTOR:索引树状 RAG,使用树结构来捕捉文本的高级和低级细节

递归摘要作为上下文摘要技术:递归摘要提供了文档的简明视图,使人们能够更专注地参与内容。尽管递归摘要模型对于捕捉更广泛的主题很有效,但可能会忽略细节。LlamaIndex通过类似的方式摘要相邻的文本块,但也保留了中间节点,因此保留了不同级别的细节,保持了细粒度的细节。然而,这两种方法由于依赖邻接来对节点进行分组或摘要,可能仍然会忽略文本内的远程依赖关系,而RAPTOR可以找到并组织这些依赖关系。

Debroon 8330

温度PID控制PLC程序

温度PID稳定控制程序,适用于欧姆龙PLC,对其他PLC也具有很大参考价值

汉书HE8,好用的汇编代码编写工具

汉书HE8,好用的汇编代码编写工具早期编写汇编代码所用功能强大

怎样能把文件夹表示成树形的文本字符串结构

1.win+r 快捷键 输入cmd 打开命令提示符。 2.cd 文件路径 找到对应文件夹路径。 3.打出命令 tree/f>file.txt 回车 tree/f>file.txt 4.在对应文件夹下会出生成一个file.txt 打开

编辑编辑器 1352

大中型超市收银系统(可直接运行)

光步前台收银系统系统功能:商品销售、商品退货、挂单、收银员权限、会员销售、单品取消、整单取消、商品查询、脱机销售、脱机数据上传,基本资料下载,开钱箱、小票打印、收款结算,支持多币种付款方式(现金、储值卡、礼券、微信等),支持多种促销。运行环境:.net 4.0登陆信息用户名:1001 密码:123456内置商品信息,商品编码可输入00001000 - 00010000,测试效果相关功能键F5 结算 F9挂单 F11商品查询 F8退货 Insert单品取消 Del整单取消 F12开钱箱F2 会员 Ctrl+Z退出系统 Home 锁屏 相关源码待公开

将文件夹下面的文件导出为树形TXT文本

找到文件夹,输入tree/f>文件名.txt 执行完毕多出一个文件: 文件夹树结构文本打印完成:

邪人君子的博客 5462

蓝牙模块HM-10手册

蓝牙模块HM-10手册,该手册对蓝牙模块HM-10进行了详细的介绍和使用方法以及一些AT指令。

上一篇: 火狐下,表单无法刷新重置问题的分析与解决
下一篇: Java防止非法和重复表单提交的分析
老紫竹
博客等级 码龄19年 1万+粉丝 1252原创
评论 6
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值