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_Data Structures - Fatal编程技术网

如何在Java中创建具有多种对象类型的树?

如何在Java中创建具有多种对象类型的树?,java,data-structures,Java,Data Structures,我试图在Java中使用树结构,但我需要它在其数据字段中保存不同的类型。我的问题格式与此非常相似,但我无法根据该问题的答案找到问题的答案 下面是我的简单TreeNode类。我只包含了代码的框架 public class TreeNode<Character> { public Character data; public TreeNode<Character> parent; public TreeNode<Character> left

我试图在Java中使用树结构,但我需要它在其数据字段中保存不同的类型。我的问题格式与此非常相似,但我无法根据该问题的答案找到问题的答案

下面是我的简单TreeNode类。我只包含了代码的框架

public class TreeNode<Character> {
    public Character data;
    public TreeNode<Character> parent;
    public TreeNode<Character> leftChild;
    public TreeNode<Character> rightChild;

    // basic methods, code omitted for simplicity
    public TreeNode(Character data) {...}
    public TreeNode<Character> addLeftChild(Character data) {...}
    public TreeNode<Character> addRightChild(Character data) {...}
}
等等

我可以在类中更改什么以使其支持
字符
NFA
?我应该在每个方法中使用
公共类树节点
,然后以某种方式将
对象
转换为
字符
还是
NFA

我见过其他使用
迭代器的例子,但是在阅读了Java文档之后,我仍然不确定如何实现它

以下是
NFA
的框架,仅供参考
Character
是通用的
java.lang.Character

public class NFA {
    public int numStates;
    public ArrayList<Character> alphabet;
    public ArrayList<Transition> transitionFunction;
    public int startState;
    public ArrayList<Integer> endStates;

    // constructors
}
公共类NFA{
国家间的公共关系;
公共阵列列表字母表;
公共数组列表传递函数;
公共int startState;
公共阵列列表结束状态;
//建设者
}

我认为最好创建实现
TreeNode
对象的不同类型的节点

例如:

public class NFANode implements TreeNode {

}

public class charNode implements TreeNode {

}

并且您的树仅与
TreeNode
相关。

使用泛型可以为您解决此问题,如下所示:

public class TreeNode<T Extends ClassThatIsACharacterAndAnNFA> {
    public T data;
    public TreeNode<T> parent;
    public TreeNode<T> leftChild;
    public TreeNode<T> rightChild;

    // basic methods, code omitted for simplicity
    public TreeNode(T data) {...}
    public TreeNode<T> addLeftChild(T data) {...}
    public TreeNode<T> addRightChild(T data) {...}
}
公共类树节点{
公共数据;
公共树节点父节点;
公共TreeNode leftChild;
公共TreeNode rightChild;
//基本方法,为简单起见省略代码
公共树节点(T数据){…}
公共树节点addLeftChild(T数据){…}
公共树节点addRightChild(T数据){…}
}

这显然是假设NFA和Character从同一个类扩展而来,在本例中为:ClassThatIsCharacterandAnnfa。

此人这样做了:@GlenPierce技术上可行,感谢您提供的解决方案,但是否有更干净的方法添加第二个数据字段(一个用于Character,一个用于NFA)?如果我这样做,那么树将占用更多的内存,并且有很多大部分未使用的位。不幸的是,Character和NFA不是从同一个类扩展而来的。您是严重资源受限还是什么?这些课程是巨大的内存消耗吗?这棵树很大吗?你似乎非常关心这个类的内存占用。我不认为我一定非常关心内存。只是每个节点只有1个
NFA
或1个
字符
。为什么我会有一个解决方案,要求每个节点都包含两种数据类型,而每个节点只使用一种数据类型?经过仔细考虑,请使用@ahmed eshra的接口选项。我认为它会以你所寻求的方式解决你的问题。您必须从每个类中的接口实现每个方法,但您将实现所寻求的减少占用空间的目标。我鼓励您接受这个答案。我感谢您的帮助,您可以使用我的+1类sirI。我认为这将比我的解决方案更有效,直到您需要访问节点的特定于类的功能,但如果是这样的话,您可能能够将它们重新转换为其原始类(假设您可以在运行时可靠地确定哪个节点是哪个类)。现在回想起来,我的解决方案也有类似的缺陷。一棵树包含多个数据类型是很困难的。
public class TreeNode<T Extends ClassThatIsACharacterAndAnNFA> {
    public T data;
    public TreeNode<T> parent;
    public TreeNode<T> leftChild;
    public TreeNode<T> rightChild;

    // basic methods, code omitted for simplicity
    public TreeNode(T data) {...}
    public TreeNode<T> addLeftChild(T data) {...}
    public TreeNode<T> addRightChild(T data) {...}
}