V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
zhongpingjing
V2EX  ›  Java

树形结构的数据应该如何拷贝

  •  
  •   zhongpingjing · 2022-09-05 19:08:31 +08:00 · 2147 次点击
    这是一个创建于 810 天前的主题,其中的信息可能已经有所发展或是发生改变。

    两种树形结构的类例如下,层级不定

    public class A {
    
        private String code;
    
        private String parentCode;
    
        private String name;
     
        private Integer sequence;
        
        private List<A> children;
    }
    
    
    public class B {
    
        private Long id;
    
        private String name;
    
        private Long parentId;
    
        private Long orderNo;
    
        private List<B> children;
    
    }
    
    

    目前代码写的转化逻辑是,先扁平化树为 List ,转化,再构建树。感觉这种方式有点笨,有其他比较好的方式吗(除了 json 序列化 /反序列化)

    14 条回复    2022-09-06 09:38:48 +08:00
    XiLingHost
        1
    XiLingHost  
       2022-09-05 19:13:42 +08:00
    不喜欢 json 可以试试 yaml
    sadfQED2
        2
    sadfQED2  
       2022-09-05 19:14:35 +08:00 via Android
    直接递归遍历?如果树比较大的话循环遍历?
    zhongpingjing
        3
    zhongpingjing  
    OP
       2022-09-05 19:16:53 +08:00
    @sadfQED2 试了层序遍历树,没办法边遍历边转化出另一课树,只能转化出 2 层,3 层以上就丢失了,不知道是不是写法有问题
    dcsuibian
        4
    dcsuibian  
       2022-09-05 19:18:01 +08:00   ❤️ 3
    public Tree copy(){
    Tree tree = new Tree();
    tree.id = id;
    for(Tree child : children){
    tree.children.add(child.copy());
    }
    return tree;
    }
    zhongpingjing
        5
    zhongpingjing  
    OP
       2022-09-05 19:18:20 +08:00
    @XiLingHost 倒不是不喜欢,主要是想通过一次遍历来转化
    pxiphx891
        6
    pxiphx891  
       2022-09-05 19:25:16 +08:00
    循环遍历就行了
    tuiL2
        7
    tuiL2  
       2022-09-05 19:34:26 +08:00 via Android
    简单点的话,node 再实现一个 copy 方法。
    ianEros
        8
    ianEros  
       2022-09-05 19:48:19 +08:00
    递归啊 如果有 children 把 children 传进来获取返回的 B
    zhongpingjing
        9
    zhongpingjing  
    OP
       2022-09-05 19:53:53 +08:00
    @dcsuibian 谢大佬。。思考半天,结果大佬几行代码就解决了
    irytu
        10
    irytu  
       2022-09-06 06:21:25 +08:00 via iPhone
    leetcode 是不是有类似的题 虽然可能只是二叉树 但是同样适用于 k 叉…
    tramm
        11
    tramm  
       2022-09-06 08:22:32 +08:00
    直接工具类 copy 啊.
    例如 Hutool 的 Beanutil 之类的
    summerLast
        12
    summerLast  
       2022-09-06 09:32:41 +08:00
    迭代 或 mapstruct
    扁平化也挺好的

    迭代的思路

    B convert(A a){
    b.setId(a.code)
    b.setName(a.name)

    }
    summerLast
        13
    summerLast  
       2022-09-06 09:36:29 +08:00
    迭代 或 mapstruct
    扁平化也挺好的

    迭代的思路

    B convert(A a){
    b.setId(a.code)
    a.children.forEach(o=>b.children.add(convert(o)))
    }
    summerLast
        14
    summerLast  
       2022-09-06 09:38:48 +08:00
    迭代 或 mapstruct
    扁平化也挺好的

    迭代的思路

    B convert(A a){
    B b = new B()
    b.setId(a.code)
    a.children.forEach(o->b.children.add(convert(o)))
    returen b;
    }

    (莫名回复了)
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   实用小工具   ·   2666 人在线   最高记录 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 18ms · UTC 11:45 · PVG 19:45 · LAX 03:45 · JFK 06:45
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.