【问题标题】:Storing Equations in a Java Tree Structure在 Java 树结构中存储方程
【发布时间】:2014-02-14 01:46:33
【问题描述】:

我希望能够将方程/算法存储在 java 树结构中,以便我可以轻松检索和操作某些节点。

为了存储方程式,我为运算、关系和逻辑运算创建了三个枚举集:

private enum Operation {
    PLUS, MINUS, TIMES, DIVIDE, SIN, COS, TAN
}
private enum Relation {
    EQUALS, NOT_EQUALS, GREATER_THAN, GREATER_THAN_OR_EQ, LESS_THAN, LESS_THAN_OR_EQ
}
private enum LogicOperation {
    AND, OR, TERNARY
}

我想创建一个树结构,可以容纳任何这些枚举集或任何值。由于树只是来自根节点的节点网络,因此我创建了一个 Node 类,它可以有一个、两个或三个孩子(一个孩子用于三角运算,两个用于算术运算,三个用于三元逻辑):

public class Node<T> {

    private T data;
    List<Node<T>> nodeChildren = new ArrayList<Node<T>>();

    Node(T data) {
        this.data = data;
    }

    public void addChild(Node<T> child) {
        this.nodeChildren.add(child);
    }

    public void addChildren(Node<T> child1, Node<T> child2) {
        this.nodeChildren.add(child1);
        this.nodeChildren.add(child2);
    }

    public void addChildren(Node<T> child1, Node<T> child2, Node<T> child3) {
        this.nodeChildren.add(child1);
        this.nodeChildren.add(child2);
        this.nodeChildren.add(child3);
    }

    public T getData() {
        return this.data;
    }

    public List<Node<T>> getNodeChildren() {
        return this.nodeChildren;
    }
}

我不擅长泛型,但说我想存储“5 + 5”,我为“+”创建了一个根节点:

Node<Operation> op = new Node(Operation.PLUS);

但是当我尝试添加两个整数类型的孩子时,我得到一个类型不匹配的错误:

op.addChildren(new Node<Integer>(5), new Node<Integer>(5));

有人能指出我正确的方向吗?

谢谢

** 编辑 **

任何有兴趣的人的答案是使用泛型类型?:

List<Node<?>> nodeChildren = new ArrayList<Node<?>>();

【问题讨论】:

    标签: java generics types tree structure


    【解决方案1】:

    您需要两个类型参数,一个用于操作类型,一个用于子类型。因此,您的示例行将显示为:

    Node<Operation,Integer> op = new Node<>(Operation.PLUS);
    

    Node 类的声明将开始:

    public class Node<T,V> {
    
        private T data;
        List<Node<V>> nodeChildren = new ArrayList<Node<V>>();
    
        // ...
    
        public void addChild(Node<V> child) // etc
    

    【讨论】:

    • 感谢您的回复。但是,如果我将类 Node 更改为接受两个类型参数,那么 List nodeChildren 和 addChild 中的 child 参数肯定也需要两个参数吗?但是后来我在尝试添加孩子时遇到了问题,因为必须有两个类型参数:Node&lt;Operation, Integer&gt; op = new Node&lt;Operation, Integer&gt;(Operation.PLUS);op.addChildren(new Node&lt;Integer, Integer&gt;(5), new Node&lt;Integer&gt;&lt;Integer&gt;(5));
    猜你喜欢
    • 1970-01-01
    • 2021-08-25
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多