Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/334.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
在Java树结构中存储方程_Java_Generics_Types_Tree_Structure - Fatal编程技术网

在Java树结构中存储方程

在Java树结构中存储方程,java,generics,types,tree,structure,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

我希望能够将方程/算法存储在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
}
我想创建一个树结构,它可以保存这些枚举集或任何值。由于树只是来自根节点的节点网络,因此我创建了一个类节点,它可以有一个、两个或三个子节点(一个子节点用于trig运算,两个子节点用于算术运算,三个子节点用于三元逻辑):

公共类节点{
私有T数据;
List nodeChildren=new ArrayList();
节点(T数据){
这个数据=数据;
}
公共void addChild(节点子节点){
this.nodeChildren.add(child);
}
公共void addChildren(节点child1、节点child2){
this.nodeChildren.add(child1);
this.nodeChildren.add(child2);
}
public void addChildren(节点child1、节点child2、节点child3){
this.nodeChildren.add(child1);
this.nodeChildren.add(child2);
this.nodeChildren.add(child3);
}
公共T getData(){
返回此.data;
}
公共列表getNodeChildren(){
返回此.nodeChildren;
}
}
我不擅长泛型类型,但如果我想存储“5+5”,我会为“+”创建一个根节点:

Node<Operation> op = new Node(Operation.PLUS);
Node op=新节点(Operation.PLUS);
但是,当我尝试添加两个integer类型的子项时,会出现类型不匹配错误:

op.addChildren(new Node<Integer>(5), new Node<Integer>(5));
op.addChildren(新节点(5),新节点(5));
有人能给我指出正确的方向吗

谢谢

**编辑**

对任何感兴趣的人来说,答案是使用泛型类型:

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

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

Node<Operation,Integer> op = new Node<>(Operation.PLUS);
Node op=新节点(Operation.PLUS);
节点类的声明将开始:

public class Node<T,V> {

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

    // ...

    public void addChild(Node<V> child) // etc
公共类节点{
私有T数据;
List nodeChildren=new ArrayList();
// ...
public void addChild(节点子节点)//etc

谢谢您的回复。但是,如果我将类节点更改为接受两个类型参数,那么列表nodeChildren和addChild中的子参数肯定也需要两个参数?但是,我在尝试添加子参数时遇到了问题,因为必须有两个类型参数:
节点op=new Node(Operation.PLUS);
op.addChildren(新节点(5),新节点(5));
public class Node<T,V> {

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

    // ...

    public void addChild(Node<V> child) // etc