首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >带圈的树

带圈的树
EN

Stack Overflow用户
提问于 2019-12-01 20:51:43
回答 1查看 76关注 0票数 0

因此,我想知道从雇员和雇主之间的关系创建结构的最佳方法是什么,例如,使用可能的循环

代码语言:javascript
复制
id: 1 boss: 2
id: 2 boss: 3
id: 3 boss: 1
Id: 4 boss: 1
id: 10 boss: 11
id: 11 boss: null

然后能够找到id1的老板,例如

我一直在考虑具有反向关系的简单树,但是如何为循环做准备?

代码语言:javascript
复制
public class Tree<T> {
 private Node<T> root;

 public Tree(T rootData) {
    root = new Node<T>();
    root.data = rootData;
    root.employees = new ArrayList<Node<T>>();
 }

 public static class Node<T> {
    private T data;
    private List<Node<T>> employees ;
 }
}
EN

回答 1

Stack Overflow用户

发布于 2019-12-01 21:25:10

我已经用设计模式解决了这个问题。

我使用了两种模式,因此模式composite和模式visitor

我用下面的代码来写这个结构

所有节点的接口

代码语言:javascript
复制
public interface INode{
    //for appli visitor
    public void accept(IVisitor visitor);
}

用于实现您的叶节点

代码语言:javascript
复制
public class INodeLeaf implements INode{

    public String getFoo();
}

为了实现中间节点的抽象类,您可以使用更多类型的节点中介

代码语言:javascript
复制
    public abstract class AbstractNode implements INode{

    private INode left;
    private INode right;

    public AbstractNode(INode left, INode right) {
        this.left = left;
        this.right = right;
    }

    public INode getLeft() {
        return left;
    }

    public INode getRight() {
        return right;
    }

}

您必须至少是AbstractNode中的一个具体节点

对于访问结构,您可以实现patter访问器,如下所示

代码语言:javascript
复制
public interface IVisitor {

    void visitNodeLeaf(NodeLeaf node);

    void visitYorConcreateNode(YourConcreateNode node);

}

实现可以是

代码语言:javascript
复制
public class VisitorFoo implements IVisitor {

    private String foo;

    @Override
    public void visitNodeLeaf(INodeFoglia node) {
        foo += node.getFoo();
    }

    @Override
    public void visitYorConcreateNode(NodeDivisione node) {
        node.getLeft().accept(this);
        node.getRight().accept(this);
    }
}

您的问题上的

我是树结构的一般实现,对于你的例子,你可以需要List<INode>和访问者内部的方法visitYorConcreateNode(..),应该是访问列表,但实现不会改变。

对于结构上的复杂操作对于结构上的复杂操作我认为最好也使用模式Strategy

在此之后

代码语言:javascript
复制
public class StrategyFoo implement IStrategy{

   private IVisitor setTheVisitor;

//other
   public void runOperation(){//do nothind for moment}
}
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/59125669

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档