V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
V2EX 提问指南
iMouseWu
V2EX  ›  问与答

各位有没有什么比较好的方式来把"把路径字符串转换成一棵树,并且可以通过输入一个节点把它的子节点全部输出来"。

  •  
  •   iMouseWu · 2014-11-20 17:12:49 +08:00 · 3533 次点击
    这是一个创建于 3683 天前的主题,其中的信息可能已经有所发展或是发生改变。
    各位有没有什么比较好的方式来把"把路径字符串转换成一棵树,并且可以通过输入一个节点把它的子节点全部输出来"。
    比如说现在我有以下字符串:
    A-B-C-D;
    A-B-C-F;
    A-B-H;
    A-B-G-T;
    转换以后就成这个样子:
    A
    B
    C
    H
    D
    F
    G
    比如说我输入B节点,那么输出的结果就是:
    C
    H
    D
    F
    G
    我现在能想法想到的方法是,对原始数据处理一下。先增加一个root节点,现在我需要查root下的所有子节点。那么就遍历字符串数组A,并且设置level=0,把字符串用"-"分割成数组B,取出B[0]的值并且去重。这些取出来都是第一层的。然后再通过B[0]的值,去找它的子节点。如果递归下去。这是通过root来生成树。
    接下来是,通过输入一个节点C,那么在输入的时候,我需要把它的层级一起传过来3|C,这种格式。其它地方和查找root的是一样的。只是把B[0]改成相应的B[3],接下来也是递归。
    这种方式的前提是同一层级下,不能有相同的名字。
    大家有没有什么比较效率和思路更加清晰的方式呀?
    第 1 条附言  ·  2014-11-20 19:21:56 +08:00
    空格被去掉了。换种方式来表达吧
    A-B-C-D;
    A-B-C-F;
    A-B-H;
    A-B-G-T;

    -A
    --B
    ---C
    ----F
    ----D
    ---H
    ---G
    ----T
    详细点,就是。
    在java中有这么一个实体。
    public class B{
    private String name;
    private List<B> b;
    }
    需要把上面的路径串转成树,放到这个实体B里面去。
    12 条回复    2014-11-21 20:53:32 +08:00
    rrfeng
        1
    rrfeng  
       2014-11-20 17:30:46 +08:00
    你这个是树吗?还是说排版出了问题??
    kslr
        2
    kslr  
       2014-11-20 18:37:49 +08:00 via Android
    有个tree命令
    iMouseWu
        3
    iMouseWu  
    OP
       2014-11-20 18:44:15 +08:00
    @rrfeng 。。。。应该是排版把空格给排掉了,。。。
    imn1
        4
    imn1  
       2014-11-20 18:51:41 +08:00
    把“-”替换为xml标签,外套<root></root>
    然后用xml parse吧

    其实每个字串是全路经的简单多了,方法多的是,正则什么的都可以,最简单就是排排序也能按字符顺序提取啊
    那些用parent id的才算难,可能要二叉树什么的
    aaaa007cn
        5
    aaaa007cn  
       2014-11-20 19:11:05 +08:00
    后缀树……吗?
    iMouseWu
        6
    iMouseWu  
    OP
       2014-11-20 19:23:02 +08:00
    @aaaa007cn 不是诶。可以看下我刚刚增加的东西。可能前面的描述不恰当。
    iMouseWu
        7
    iMouseWu  
    OP
       2014-11-20 19:23:52 +08:00
    @kslr 能不能稍微讲的详细点?这个我不是很懂
    iMouseWu
        8
    iMouseWu  
    OP
       2014-11-20 19:24:44 +08:00
    @imn1 这里需要知道哪个“-”换成哪个xml标签。
    就是这里主要是这个对对应关系难以处理
    rrfeng
        9
    rrfeng  
       2014-11-20 19:50:29 +08:00   ❤️ 1
    我懂了
    最终目的是转成 xml 形式

    所谓的成『树』只是为了进一步添加标签罢了。

    按理说这个变成树形不是很难啊

    创建一个树结构,第一条 ABCD 存进去
    然后后面每条从 X[0],查找树上有无这个节点,找到的话看子节点是否有X[1], 有的话继续,没的话添加子节点,后面的所有子节点直接跟上,不用再遍历了。

    实际上不需要变树这一步,跟变成 xml 是同样的过程。

    或许有直接 parse 成 xml 的方法?找找看?
    imn1
        10
    imn1  
       2014-11-20 20:10:14 +08:00   ❤️ 1
    @iMouseWu
    不需要作对应,换成相同的标签就行了,只是要一个套一个,形成层级就够了
    <node>A<node>B<node>……</node></node></node>
    然后用xpath paser(前面我写错了xml paser),用交并差去重,再组合
    aaaa007cn
        11
    aaaa007cn  
       2014-11-20 20:44:26 +08:00
    不知道为什么一开始会想到后缀树……
    刚才想了下
    这不是有向图的遍历问题么
    然后看到更新
    又糊涂了
    假设有
    A-B-C-D
    A-B-C-E
    A-F-C-G
    那么输入 3|C 输出应该是什么?
    那个“同一层级下不能有相同的名字”的前提是问题中已经确定的还是你自己假设的?
    iMouseWu
        12
    iMouseWu  
    OP
       2014-11-21 20:53:32 +08:00
    @aaaa007cn 是假设。如果不满足这个条件的话。那么按照我的方法来的话。就会出错
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   实用小工具   ·   2993 人在线   最高记录 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 24ms · UTC 10:55 · PVG 18:55 · LAX 02:55 · JFK 05:55
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.