gaopinsong
V2EX  ›  Java

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

  •  
  •   gaopinsong · Dec 15, 2015 · 6286 views
    This topic created in 3981 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
    msg7086
    Dec 15, 2015
    1
    不想用递归就把递归转换成队列或者栈。
    pynix
    pynix
    Dec 15, 2015
    2
    遍历一遍,扔到列表去。
    yimity
    yimity
    Dec 15, 2015 via iPhone
    3
    @pynix 遍历不得递归嘛?我还是用的递归
    yimity
    yimity
    Dec 15, 2015 via iPhone
    4
    不过我貌似是存成扁平的然后遍历成树形
    linux40
    linux40
    Dec 15, 2015 via Android
    5
    看见楼上都说遍历,我插一嘴,树的遍历只靠循环妥妥的。
    yuankui
    yuankui
    Dec 15, 2015
    6
    跟语言无关..
    yuankui
    yuankui
    Dec 15, 2015❤️1
    7
    楼主搜一下 深度优先 || 广度优先
    zhuangzhuang1988
    zhuangzhuang1988
    Dec 15, 2015
    8
    flatMap ??
    wizardoz
    wizardoz
    Dec 15, 2015❤️1
    9
    深度优先用栈(其实用到栈就相当于递归),广度优先用队列。
    sleeperqp
    sleeperqp
    Dec 15, 2015
    10
    第一反应是并查集
    Hyponet
    Hyponet
    Dec 15, 2015
    11
    bfs or dfs
    gaopinsong
    gaopinsong
    OP
    Dec 15, 2015
    12
    感谢大家的回复,今天也问了一个高端大学出来的同学,也是让我去搜
    深度优先 || 广度优先
    又学到了新的姿势。感谢各位的回复
    pke
    pke
    Dec 15, 2015
    13
    这个和 Dijkstra 算法有什么关系
    KotiyaSanae
    KotiyaSanae
    Dec 15, 2015
    14
    https://gist.github.com/SeavantUUz/74e91be581099e5536aa 把二叉树压成一个字符串(确实是扁平的集合),没有递归,因为是迭代实现的
    domty
    domty
    Dec 15, 2015
    15
    不用递归
    用 while 循环加 stack 就可以了嘛
    况且以我浅薄的经验来看
    java 的尾递归调用在不适用 java8 的某些尾递归优化的特性的情况下 效率是弱于非递归调用的
    FrankFang128
    FrankFang128
    Dec 16, 2015 via Android
    16
    没人吐槽 J8...
    gaopinsong
    gaopinsong
    OP
    Dec 17, 2015
    17
    自己搞了个递归。对于 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
    gaopinsong
    OP
    Dec 17, 2015
    18
    自己搞了个递归。对于 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
    gaopinsong
    OP
    Dec 17, 2015
    19
    囧。。上边发的。咋没有代码格式。。。。还不能自己删除。囧啊
    About   ·   Help   ·   Advertise   ·   Blog   ·   API   ·   FAQ   ·   Privacy   ·   Solana   ·   1760 Online   Highest 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 44ms · UTC 02:55 · PVG 10:55 · LAX 18:55 · JFK 21:55
    ♥ Do have faith in what you're doing.