在Java树结构中存储方程

时间:2014-02-14 01:46:33

标签: java generics types tree structure

我希望能够在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,它可以有一个,两个或三个子节点(一个子节点用于trig操作,两个用于算术运算,三个用于三元逻辑): / p>

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);

但是当我尝试添加两个类型为integer的子项时,我遇到了类型不匹配错误:

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

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

由于

**编辑**

答案是,对于任何感兴趣的人都使用泛型类型?:

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

1 个答案:

答案 0 :(得分: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