2017-05-13 85 views
1

我想在Java中使用樹結構,但我需要它在其數據字段中保存不同類型。我的問題的格式與此this question非常相似,但我無法根據該問題的答案找到我的問題的答案。如何在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) {...} 
} 

我還有一個自定義類public class NFA,我希望能夠在我的樹數據存儲在以下方式:

root 
/ \ 
NFA  Character 
    /  \ 
    Character Character 

等等...

什麼我是否可以在課堂上進行更改以使樹支持CharacterNFA?我應該在每種方法中使用public class TreeNode<Object>然後以某種方式將Object作爲CharacterNFA嗎?

我已經看到其他使用Iterator的例子,但是在閱讀了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 
} 
+0

這個人這樣做:http://stackoverflow.com/questions/43905036/why-cant-i-write-my-binary-tree-inside-a-file –

+0

@GlenPierce技術上的作品,並感謝您的該解決方案,但有沒有更清晰的方式,然後添加第二個數據字段(一個字符和一個NFA)?如果我這樣做,那麼樹會佔用更多的內存,並且有很多大部分未使用的位。 –

回答

3

我覺得這是更好地創建不同類型的實現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) {...} 
} 

這顯然假定NFA和字符來自同一類擴展,在這種情況下:ClassThatIsACharacterAndAnNFA對你那麼

+0

我認爲這會比我的解決方案更好,直到你需要訪問節點的某些特定類的特徵,但是如果情況是這樣的話,你可能能夠將它們重寫到它們的原始類(假設你可以可靠地確定哪個節點在運行時是哪個類)。 –

+1

現在我想到了,我的解決方案也有類似的缺陷。擁有一棵具有多種數據類型的樹很難。 –

0

使用泛型可以解決這個問題。

+0

不幸的是,字符和NFA不會從同一類擴展 –

+0

您是否嚴重受到資源限制?這些類是否有巨大的記憶豬?這棵樹是否巨大?你似乎非常關心這個類的內存佔用情況。 –

+0

我不相信我一定非常關心記憶。只是每個節點只有1個'NFA'或'1'字符。爲什麼我會有一個解決方案,要求每個節點都包含兩種數據類型,而我只能爲每個節點使用一種? –

相關問題