[讨论/问答][Java]如何将树形结构转为扁平集合 - V2EX
V2EX = way to explore
V2EX 是一个关于分享和探索的地方
Sign Up Now
For Existing Member  Sign In
gaopinsong
V2EX    Java

[讨论/问答][Java]如何将树形结构转为扁平集合

  •  
  •   gaopinsong Dec 15, 2015 5769 views
    This topic created in 3787 days ago, the information mentioned may be changed or developed.

    问题就如题。将树形结构转为扁平的集合。
    想不用递归。或者其他高性能的实现方式。
    最想的就是能用上 J8 最新的 Stream API 。
    但是自己咋想也想不到比较靠谱的实现。
    这里提供一个借口供大家举例。

    class Node { private String name; private List<Node> children; // get set ignore } 
    19 replies    2015-12-17 16:01:49 +08:00
    msg7086
        1
    msg7086  
       Dec 15, 2015
    不想用递归就把递归转换成队列或者栈。
    pynix
        2
    pynix  
       Dec 15, 2015
    遍历一遍,扔到列表去。
    yimity
        3
    yimity  
       Dec 15, 2015 via iPhone
    @pynix 遍历不得递归嘛?我还是用的递归
    yimity
        4
    yimity  
       Dec 15, 2015 via iPhone
    不过我貌似是存成扁平的然后遍历成树形
    linux40
        5
    linux40  
       Dec 15, 2015 via Android
    看见楼上都说遍历,我插一嘴,树的遍历只靠循环妥妥的。
    yuankui
        6
    yuankui  
       Dec 15, 2015
    跟语言无关..
    yuankui
        7
    yuankui  
       Dec 15, 2015   1
    楼主搜一下 深度优先 || 广度优先
    zhuangzhuang1988
        8
    zhuangzhuang1988  
       Dec 15, 2015
    flatMap ??
    wizardoz
        9
    wizardoz  
       Dec 15, 2015   1
    深度优先用栈(其实用到栈就相当于递归),广度优先用队列。
    sleeperqp
        10
    sleeperqp  
       Dec 15, 2015
    第一反应是并查集
    Hyponet
        11
    Hyponet  
       Dec 15, 2015
    bfs or dfs
    gaopinsong
        12
    gaopinsong  
    OP
       Dec 15, 2015
    感谢大家的回复,今天也问了一个高端大学出来的同学,也是让我去搜
    深度优先 || 广度优先
    又学到了新的姿势。感谢各位的回复
    pke
        13
    pke  
       Dec 15, 2015
    这个和 Dijkstra 算法有什么关系
    KotiyaSanae
        14
    KotiyaSanae  
       Dec 15, 2015
    https://gist.github.com/SeavantUUz/74e91be581099e5536aa 把二叉树压成一个字符串(确实是扁平的集合),没有递归,因为是迭代实现的
    domty
        15
    domty  
       Dec 15, 2015
    不用递归
    用 while 循环加 stack 就可以了嘛
    况且以我浅薄的经验来看
    java 的尾递归调用在不适用 java8 的某些尾递归优化的特性的情况下 效率是弱于非递归调用的
    FrankFang128
        16
    FrankFang128  
       Dec 16, 2015 via Android
    没人吐槽 J8...
    td width="48" valign="top" align="center">gaopinsong
        17
    gaopinsong  
    OP
       Dec 17, 2015
    自己搞了个递归。对于 Java 针对尾递归的优化,不是很了解。回头去搜索下

    private Stream<CategoryModel> flatTree(List<CategoryModel> categoryModels) {

    Stream<CategoryModel> modelStream = categoryModels.stream();

    for (CategoryModel categoryModel: categoryModels) {

    List<CategoryModel> children = categoryModel.getChild();

    if (children == null || children.size() < 1) continue;

    modelStream = Stream.concat(modelStream, flatTree(children));
    }

    return modelStream;
    }

    调用的代码

    Stream<CategoryModel> modelStream = flatTree(getCategoryTree());

    return modelStream.collect(toList());
    gaopinsong
        18
    gaopinsong  
    OP
       Dec 17, 2015
    自己搞了个递归。对于 Java 针对尾递归的优化,不是很了解。回头去搜索下

    private Stream<CategoryModel> flatTree(List<CategoryModel> categoryModels) {
    Stream<CategoryModel> modelStream = categoryModels.stream();
    for (CategoryModel categoryModel: categoryModels) {
    List<CategoryModel> children = categoryModel.getChild();
    if (children == null || children.size() < 1) continue;
    modelStream = Stream.concat(modelStream, flatTree(children));
    }
    return modelStream;
    }

    调用的代码

    Stream<CategoryModel> modelStream = flatTree(getCategoryTree());
    return modelStream.collect(toList());
    gaopinsong
        19
    gaopinsong  
    OP
       Dec 17, 2015
    。。上边发的。咋没有代码格式。。。。还不能自己删除。啊
    About     Help     Advertise     Blog     API     FAQ     Solana     1176 Online   Highest 6679       Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 58ms UTC 18:05 PVG 02:05 LAX 11:05 JFK 14:05
    Do have faith in what you're doing.
    ubao msn snddm index pchome yahoo rakuten mypaper meadowduck bidyahoo youbao zxmzxm asda bnvcg cvbfg dfscv mmhjk xxddc yybgb zznbn ccubao uaitu acv GXCV ET GDG YH FG BCVB FJFH CBRE CBC GDG ET54 WRWR RWER WREW WRWER RWER SDG EW SF DSFSF fbbs ubao fhd dfg ewr dg df ewwr ewwr et ruyut utut dfg fgd gdfgt etg dfgt dfgd ert4 gd fgg wr 235 wer3 we vsdf sdf gdf ert xcv sdf rwer hfd dfg cvb rwf afb dfh jgh bmn lgh rty gfds cxv xcv xcs vdas fdf fgd cv sdf tert sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf shasha9178 shasha9178 shasha9178 shasha9178 shasha9178 liflif2 liflif2 liflif2 liflif2 liflif2 liblib3 liblib3 liblib3 liblib3 liblib3 zhazha444 zhazha444 zhazha444 zhazha444 zhazha444 dende5 dende denden denden2 denden21 fenfen9 fenf619 fen619 fenfe9 fe619 sdf sdf sdf sdf sdf zhazh90 zhazh0 zhaa50 zha90 zh590 zho zhoz zhozh zhozho zhozho2 lislis lls95 lili95 lils5 liss9 sdf0ty987 sdft876 sdft9876 sdf09876 sd0t9876 sdf0ty98 sdf0976 sdf0ty986 sdf0ty96 sdf0t76 sdf0876 df0ty98 sf0t876 sd0ty76 sdy76 sdf76 sdf0t76 sdf0ty9 sdf0ty98 sdf0ty987 sdf0ty98 sdf6676 sdf876 sd876 sd876 sdf6 sdf6 sdf9876 sdf0t sdf06 sdf0ty9776 sdf0ty9776 sdf0ty76 sdf8876 sdf0t sd6 sdf06 s688876 sd688 sdf86