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