RError.com

RError.com Logo RError.com Logo

RError.com Navigation

  • 主页

Mobile menu

Close
  • 主页
  • 系统&网络
    • 热门问题
    • 最新问题
    • 标签
  • Ubuntu
    • 热门问题
    • 最新问题
    • 标签
  • 帮助
主页 / 问题 / 791618
Accepted
Иван Гладуш
Иван Гладуш
Asked:2020-02-28 22:50:20 +0000 UTC2020-02-28 22:50:20 +0000 UTC 2020-02-28 22:50:20 +0000 UTC

树数据结构的构建器?

  • 772

有必要为树状数据结构实现模式构建器。我尝试过的一切都表明,这很难做到,而且非常不方便,而且在一些新的之后更容易做到。如果有人解决了类似的问题并展示了这样一个构建器的例子,我会非常高兴。

java
  • 2 2 个回答
  • 10 Views

2 个回答

  • Voted
  1. Best Answer
    tym32167
    2020-02-28T23:29:50Z2020-02-28T23:29:50Z

    假设我们要构建一棵树。我们有一个节点

    public class Node
    {
        public int Value { get; set;}
        public Node Left { get; set;}
        public Node Right { get; set;}  
    }
    

    下面是一个流利的构建器的例子。即调用可以组合成链来构建树

    public class TreeBuilder 
    {
        private InnerNode _root;
        private InnerNode _currentNode;
    
        private TreeBuilder(int value)
        {
            _root = new InnerNode() { Value = value };
            _currentNode = _root;
        }
    
        public static TreeBuilder Create(int value)
        {
            return new TreeBuilder(value);
        }
    
        public TreeBuilder AddLeft(int value)
        {
            _currentNode.Left = new InnerNode() { Value = value, Parent = _currentNode };
            return Left();
        }
    
        public TreeBuilder AddRight(int value)
        {
            _currentNode.Right = new InnerNode() { Value = value, Parent = _currentNode };
            return Right();
        }
    
        public TreeBuilder Left()
        {
            _currentNode = _currentNode.Left;
            return this;
        }
    
        public TreeBuilder Right()
        {
            _currentNode = _currentNode.Right;
            return this;
        }
    
        public TreeBuilder Root()
        {
            _currentNode = _root;
            return this;
        }
    
        public TreeBuilder Parent()
        {
            _currentNode = _currentNode.Parent;
            return this;
        }
    
        public Node Build()
        {
            return Build(_root);
        }
    
        private Node Build (InnerNode node)
        {
            if (node == null) return null;
            return new Node() {Value = node.Value, Left =Build(node.Left), Right=Build(node.Right)};
        }
    
        private class InnerNode
        {
            public int Value { get; set; }
            public InnerNode Left { get; set; }
            public InnerNode Right { get; set; }
            public InnerNode Parent { get; set; }
        }
    }
    

    在构建器内部,为了表示不完整的树,我使用了一个单独的类,因为这个类有一个到父级的链接,并且用它遍历节点更方便。从理论上讲,可以根据需要积累有关正在构建的对象的信息。

    好吧,实际上,使用:

    var root = TreeBuilder
                .Create(10)
                    .AddLeft(5)
                        .Parent()
                    .AddRight(15)
                        .AddLeft(10)
                        .Build();                       
    
    
    //   10
    //  /  \
    //  5   15
    //      /
    //     10
    
    • 8
  2. Artem Konovalov
    2020-02-28T23:15:13Z2020-02-28T23:15:13Z

    我会冒着引用来源的风险。结果发现了很多代码:

    private static class Team {
        public final List<Player> players;
    
        public Team(List<Player> players) {
            this.players = Collections.unmodifiableList(players);
        }
    
        public static TeamBuilder builder() {
            return new TeamBuilder();
        }
    
        static class TeamBuilder {
            private List<Player.PlayBuilder> playerBuilders = new ArrayList<>();
    
            public TeamBuilder add(Player.PlayBuilder builder) {
                playerBuilders.add(builder);
                return this;
            }
    
            public Team build() {
                List<Player> players = new ArrayList<>();
                for (Player.PlayBuilder playerBuilder : playerBuilders)
                    players.add(playerBuilder.build());
    
                return new Team(players);
            }
        }
    
        static class Player {
            public final String name;
    
            Player(String name) {
                this.name = name;
            }
    
            public static PlayBuilder builder() {
                return new PlayBuilder();
            }
    
            static class PlayBuilder {
                private String name;
    
                public Player build() {
                    return new Player(name);
                }
    
                public PlayBuilder setName(String name) {
                    this.name = name;
                    return this;
                }
            }
        }
    }
    

    像这样使用:

    Team.builder()
        .add(Team.Player
                 .builder()
                 .setName("first player"))
        .add(Team.Player
                 .builder()
                 .setName("second player"))
        .add(Team.Player
                 .builder()
                 .setName("third player"))
        .build();
    

    主要思想是为每个对象创建自己的构建器,然后将其转移到另一个对象,依此类推。

    • 2

相关问题

Sidebar

Stats

  • 问题 10021
  • Answers 30001
  • 最佳答案 8000
  • 用户 6900
  • 常问
  • 回答
  • Marko Smith

    是否可以在 C++ 中继承类 <---> 结构?

    • 2 个回答
  • Marko Smith

    这种神经网络架构适合文本分类吗?

    • 1 个回答
  • Marko Smith

    为什么分配的工作方式不同?

    • 3 个回答
  • Marko Smith

    控制台中的光标坐标

    • 1 个回答
  • Marko Smith

    如何在 C++ 中删除类的实例?

    • 4 个回答
  • Marko Smith

    点是否属于线段的问题

    • 2 个回答
  • Marko Smith

    json结构错误

    • 1 个回答
  • Marko Smith

    ServiceWorker 中的“获取”事件

    • 1 个回答
  • Marko Smith

    c ++控制台应用程序exe文件[重复]

    • 1 个回答
  • Marko Smith

    按多列从sql表中选择

    • 1 个回答
  • Martin Hope
    Alexandr_TT 圣诞树动画 2020-12-23 00:38:08 +0000 UTC
  • Martin Hope
    Suvitruf - Andrei Apanasik 什么是空? 2020-08-21 01:48:09 +0000 UTC
  • Martin Hope
    Air 究竟是什么标识了网站访问者? 2020-11-03 15:49:20 +0000 UTC
  • Martin Hope
    Qwertiy 号码显示 9223372036854775807 2020-07-11 18:16:49 +0000 UTC
  • Martin Hope
    user216109 如何为黑客设下陷阱,或充分击退攻击? 2020-05-10 02:22:52 +0000 UTC
  • Martin Hope
    Qwertiy 并变成3个无穷大 2020-11-06 07:15:57 +0000 UTC
  • Martin Hope
    koks_rs 什么是样板代码? 2020-10-27 15:43:19 +0000 UTC
  • Martin Hope
    Sirop4ik 向 git 提交发布的正确方法是什么? 2020-10-05 00:02:00 +0000 UTC
  • Martin Hope
    faoxis 为什么在这么多示例中函数都称为 foo? 2020-08-15 04:42:49 +0000 UTC
  • Martin Hope
    Pavel Mayorov 如何从事件或回调函数中返回值?或者至少等他们完成。 2020-08-11 16:49:28 +0000 UTC

热门标签

javascript python java php c# c++ html android jquery mysql

Explore

  • 主页
  • 问题
    • 热门问题
    • 最新问题
  • 标签
  • 帮助

Footer

RError.com

关于我们

  • 关于我们
  • 联系我们

Legal Stuff

  • Privacy Policy

帮助

© 2023 RError.com All Rights Reserve   沪ICP备12040472号-5