从路径字符串中获取类似树的结构

2023-11-23

我已经被困了两天了,因为我对指针和递归不太坚定。我有一系列类似路径的结构,可以说:

s:=[]string {
  "a/b/c",
  "a/b/g",
  "a/d",
}

具有这样的数据结构:

 type Node struct {
   Name     string `json:"name"`
   Children []Node `json:"children"`
}

我想最终得到这样的结果:

{
 "name": "a",
 "children": [
     {
      "name": "b",
      "children": [
        {
         "name": "c",
         "children": []
        },
        {
         "name": "g",
         "children": []
        }
      ]
    },
    {
     "name": "d",
     "children": []
    }
  ]
}

我尝试用递归来构建它,这工作得很好,但只适用于一个字符串(例如“a/b/c”),一旦我尝试实现应该添加缺失节点的东西(“g”中的“) a/b/g") 到一棵树,我被困住了。

我有类似的东西:

func appendChild(root Node, children []string) Node {
   if len(children) == 1 {
      return Node{children[0], nil}
   } else {
      t := root
      t.Name=children[0]
      t.Children = append(t.Children, appendChild(root, children[1:]))
      return t
   }
}

有人可以指出我一个有效的解决方案吗?


https://play.golang.org/p/9pER5cwChF

func AddToTree(root []Node, names []string) []Node {
    if len(names) > 0 {
        var i int
        for i = 0; i < len(root); i++ {
            if root[i].Name == names[0] { //already in tree
                break
            }
        }
        if i == len(root) {
            root = append(root, Node{Name: names[0]})
        }
        root[i].Children = AddToTree(root[i].Children, names[1:])
    }
    return root
}

示例输出(请注意,我使用了omitempty在儿童领域,因为我不喜欢null我的 JSON 中的条目):

[{
    "name": "a",
    "children": [{
        "name": "b",
        "children": [{
            "name": "c"
        }, {
            "name": "g"
        }]
    }, {
        "name": "d"
    }]
}]

与您的版本的显着差异:

  • 它对节点列表而不是单个节点的子节点进行操作。这很重要,因为您的版本假设所有树都具有相同的单个根节点(a),但情况可能并非如此。在您的版本中处理该问题的唯一方法是在根处有一个“假”节点。
  • 它不会重用输入节点。这是您的代码的主要问题之一。如果 len(children) > 1,则更新输入节点的名称,追加到其子节点,然后递归。这意味着切片的每个先前级别都成为子级的一部分。你需要创建一个new节点代替。
  • 它实际上搜索树。您没有搜索树来查看要插入的项目是否已存在,因此您复制了节点(特别是节点 b)
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

从路径字符串中获取类似树的结构 的相关文章

  • Golang - 更改 Windows 上的构建工作路径

    我正在使用 SublimeText3 GoSublime 插件 在 Windows 8 上测试简单的 Go 程序 go run v example go 在运行之前它正在内部编译 应用程序数据 本地 温度 目录 我的防病毒程序认为这是病毒并
  • 给定方法值,获取接收者对象

    Go 有没有办法从方法值获取接收者对象 例如有没有这样的MagicFunc这将使以下程序输出字符串my info来自底层 Foo 实例 package main import fmt type Foo struct A string fun
  • 共享来自单独命令/进程的属性

    我提供带有多个命令和子命令的命令行工具 我使用cobra https github com spf13 cobra命令行 我有两个单独的命令首先是前提条件e 给其他人 例如第一个命令是通过创建临时文件夹并验证某些文件来首选环境 第二个命令应
  • 是否支持动态变量?

    我想知道Go中是否可以动态创建变量 我在下面提供了一个伪代码来说明我的意思 我将新创建的变量存储在切片中 func method slice make type for i 0 i lt 10 i var variable i i slic
  • Python递归限制与堆栈大小?

    我了解递归中每个递归调用如何堆栈在堆栈上 如果超出堆栈限制 则会出现堆栈溢出 那么为什么Python的sys getrecursionlimit 返回一个数字 递归调用的最大深度 这不取决于我在该递归函数中所做的事情吗 或者它是否以某种方式
  • 在 IntelliJ IDEA 中运行。多个文件和错误未定义:数据

    我想使用 IntelliJ IDE 社区版编写代码GO Go语言 我安装了正确的插件 并安装了构建应用程序所需的所有工具 我的应用程序包含以下两个文件 每个都在目录中 事件服务器 Main go Data go 如果我想使用 Run Ctl
  • 使用 testify 模拟接口方法两次,输入和输出不同

    如何在 golang 测试中模拟接口方法两次 例如 type myCache interface Get key string data interface error type service struct cache myCache f
  • Java-使用递归压平数组

    我一直在练习算法 递归一直是我的弱项 该问题要求将嵌套数组展平为单个数组 如果使用给出 O n 3 给定相同大小的 3d 数组 解决方案的循环 这将很简单 然而 通过递归 我已经挣扎了几个小时 这就是我所拥有的 请注意 我已经尝试过使用我的
  • 在处理程序之后访问 HTTP 请求上下文

    在我的日志记录中间件 链中的第一个 中 我需要访问一些在链下游的某些身份验证中间件中编写的上下文 并且仅在处理程序本身执行之后 旁注 需要首先调用日志记录中间件 因为我需要记录请求的持续时间 包括在中间件中花费的时间 此外 当权限不足时 身
  • 在golang中获取TTFB(第一个字节的时间)值

    我正在尝试获取 TTFB 值和 Connect 值 c exec Command curl w Connect time connect TTFB time starttransfer Total time time total o dev
  • XSLT 将平面树结构转换为列表

    我有一个描述eshop树结构的xml文件 我只需要获取所有子组的列表 我不知道结构中有多少个父 子级别 输入 xml 如下所示
  • 我应该对算法使用递归还是记忆化?

    如果我可以选择使用递归或记忆来解决问题 我应该使用哪一个 换句话说 如果它们都是可行的解决方案 因为它们提供了正确的输出并且可以在我正在使用的代码中合理地表达 那么我什么时候会使用其中一个而不是另一个 它们并不相互排斥 您可以同时使用它们
  • 在树结构的 Big-O 表示法中:为什么有些来源引用 O(logN),有些来源引用 O(h)?

    在研究遍历二叉搜索树的任何算法的复杂性时 我看到两种不同的方式来表达同一件事 版本 1 最坏情况下的遍历算法对树的每个高度进行一次比较 因此复杂度是O h 版本 2 最坏情况下的遍历算法对树的每个高度进行一次比较 因此复杂度是O logN
  • 如何在 Go 中从 stdin 解析无限 json 数组?

    我正在尝试编写一个 i3status 的小替代品 一个与 i3bar 兼容的小程序进行通信this http i3wm org docs i3bar protocol html协议 他们通过标准输入和标准输出交换消息 两个方向的流都是一个无
  • GXT 3 中树的单击处理程序?

    我一直在翻阅GXT3 s Tree API http dev sencha com deploy gxt 3 0 0 rc2 javadoc gxt com sencha gxt widget core client tree Tree h
  • 使用 Gorilla 会话自定义后端有什么优势?

    我想使用 Redis 进行会话管理 但我不明白使用 Redis 作为 Gorilla 会话包的自定义后端比直接使用它有什么优势 Gorilla 会话包的链接 http www gorillatoolkit org pkg sessions
  • 递归例程获取PropertyInfo

    我正在尝试创建一个递归例程 它将检索指定对象 在 NET 3 5 中 下的所有成员的 PropertyInfos 直接成员的一切都正常 但它还需要解析嵌套类 及其嵌套类等 我不明白如何处理解析嵌套类的部分 这部分代码你会怎么写呢 publi
  • 查找并打印 x1+x2+x3=num 的解数

    我需要写一个recusive接收整数的函数num并返回方程 的解数 x1 x2 x3 num where x1 x2 x3是 1 10 之间的数字 该方法应打印所有解决方案 例如如果num 3然后该方法将打印1 1 1并将返回1 if nu
  • 打字稿中的递归未定义

    我在组件内使用画布对象来生成图表 为了使其动画化 我递归地调用该方法 我不断收到错误消息 指出该方法未定义 不确定我需要如何构建它 任何帮助表示赞赏 Animate function protected animate draw to Cl
  • 是否可以使用 go:generate 重定向 stdin/stdout

    我有一个充当管道的工具 它从标准输入读取数据并将源代码写入标准输出 是否可以设置输入 输出重定向并将此类工具与 go generate 一起使用 就像是 go generate tool lt file txt gt file go 我想出

随机推荐

  • 具有条件字段的骨干形式

    首先感谢各位大佬骨干形式谁制作了一个完美集成在backbone js框架中的工具 我正在使用backbone js 和backbone forms 插件 但我需要创建条件字段 假设我有以下表格 我想根据在中选择的值显示 或不显示 带有 th
  • Tabular.vim:如何对齐位于单词开头的两个不同分隔符的第一次出现?

    我已经安装了 Tabular 插件 只要不涉及复杂的正则表达式 它对我来说就非常有用 但我有这个清单 one abc rstuvw foo three defg bar four mn opq kludge hack twelve hijk
  • 如何在异步方法中启动未等待的后台任务?

    我正在努力思考如何执行某些操作very 在异步方法的世界中长时间运行的后台处理 使用来自的词汇斯蒂芬 克利里的博客 我有兴趣启动 委托任务 after await 执行 承诺任务 我想在承诺的值可用时立即返回该值 并让委托任务在后台继续进行
  • javascript 提升:首先提升什么——变量还是函数?

    最近我对 javascript 提升行为感到困惑 现在我陷入了困境 所以 有两个例子 var alpha alpha var beta beta f beta var f function f1 console log beta funct
  • MariaDB CURRENT_TIMESTAMP 默认值

    我正在尝试为用户注册设置一个数据库 并希望有一列包含注册日期 默认情况下应该是当前时间 我尝试运行这个查询 CREATE TABLE users
  • jasper报告中的书写方法?

    我正在创建一个 jasper 报告 我想编写一个方法 该方法接受整数并执行一些处理并返回一个字符串 我不知道如何在 jasper 报告中编写方法 可以写吗 任何人都可以帮助我吗这 我使用的是iReport3 6 0 示例代码
  • ActionModel 的未定义方法“on”

    我收到以下错误 NoMethodError in Users new Showing app views users form new haml where line 7 raised undefined method on for
  • 如何在不使用create_function的情况下重写示例?

    当查看 PHP 时创建函数它说 如果您使用 PHP 5 3 0 或更新版本匿名函数应该使用 我想重新创建相同的功能create function但使用anonymous function 我不知道如何做 或者我是否正确地接近它 本质上 我如
  • 如何使用 JUnit 测试 Java 中的抽象类?

    我是使用 JUnit 进行 Java 测试的新手 我必须使用 Java 并且我想使用单元测试 我的问题是 我有一个带有一些抽象方法的抽象类 但有些方法并不是抽象的 如何使用 JUnit 测试此类 示例代码 非常简单 abstract cla
  • MongoDB:跨集合查询

    假设这样的设置 blogposts title Example slug example post tags foo bar title Example2 slug example2 tags foo news headline Test
  • CSRF 失败:CSRF 令牌丢失或不正确

    我正在使用 Django 1 7 和 django rest framework 我创建了一个 API 它返回一些 JSON 数据 将其放入我的settings py REST FRAMEWORK DEFAULT PERMISSION CL
  • 结构构造函数:“在控制权返回给调用者之前,必须完全分配字段。”

    这是我正在尝试编写的结构 public struct AttackTraits public AttackTraits double probability int damage float distance Probability pro
  • Android 材料设计

    新的Android Material Design是否支持旧版本的Android 例如3 0或2 1 如果支持的话会是什么样子 作为真正的材料设计还是只是旧设计 我即将使用材料设计主题更新我的应用程序 那么有人已经这样做了吗 就材料设计这一
  • 为什么 mac chrome 上的选择框不响应点击事件? [复制]

    这个问题在这里已经有答案了 可能的重复 JQuery 函数不适用于 Mac 上的 Chrome 但适用于 Win 7 上的 Chrome 和所有其他浏览器 我有一个选择选项列表 div class social option div
  • 带标题的 window.open

    我可以控制发送的 HTTP 标头吗window open 跨浏览器 如果没有 我可以以某种方式window open然后在弹出窗口中使用自定义标头发出我的请求的页面 我需要一些狡猾的技巧 我可以控制window open 跨浏览器 发送的H
  • 在 Android Marshmallow 中请求多个蓝牙权限

    我正在开发一个具有连接功能的应用程序 该应用程序连接到使用 SDK 23 进行编译的蓝牙设备 我在请求蓝牙的多个权限时遇到问题 这是我到目前为止所做的 Override public void onStart super onStart i
  • 这里如何去掉trace0呢?

    信息 trace0 始终显示在蓝线的悬停文本框旁边 如何删除它 为什么不在橙线上 Trace0到底是什么意思 library plotly fig lt plot ly fig lt fig gt add trace type scatte
  • C#更改框架错误

    我正在运行 Visual Studio 2010 我只是将项目的框架从 4 0 更改为 3 5 我删除了它要求我删除的引用 Microsoft Framework 然后尝试编译 我现在收到错误 错误 1 无法加载文件或 装配 系统 绘图 版
  • 海湾合作委员会优化?漏洞?及其对项目的实际意义

    我的问题分为三个部分 问题1考虑下面的代码 include
  • 从路径字符串中获取类似树的结构

    我已经被困了两天了 因为我对指针和递归不太坚定 我有一系列类似路径的结构 可以说 s string a b c a b g a d 具有这样的数据结构 type Node struct Name string json name Child