![](/img/trans.png)
[英]implementing compareTo (Comparable<T>) for a Binary Tree(Generic)
[英]comparable used as structure in a binary tree
我有一個Java的二叉樹,很好地工作。 但我想增強節點中的數據內容。 目前我可以在其上添加值,例如:
for( int i = 1; i <=10; i++ )
t.insert( new Integer( i ) );
這將添加如下項目:
public void insert( Comparable item ) {
current = parent = grand = header;
nullNode.element = item;
...
}
這是樹的格式:
private static class RedBlackNode {
// Constructors
RedBlackNode( Comparable theElement ) {
this( theElement, null, null );
}
RedBlackNode( Comparable theElement, RedBlackNode lt, RedBlackNode rt ) {
element = theElement;
left = lt;
right = rt;
color = RedBlackTree.BLACK;
}
Comparable element; // The data in the node
RedBlackNode left; // Left child
RedBlackNode right; // Right child
int color; // Color
}
為了顯示樹,我喜歡這樣:
private void printTree( RedBlackNode t ) {
if( t != nullNode ) {
printTree( t.left );
System.out.println(t.element);
printTree( t.right );
}
}
在使用許多其他語言編程時,該元素將被聲明為結構 ,對於Java中的示例代碼 ,它被聲明為Comparable ,並且當前僅將一個元素作為整數。 我的問題是,我怎樣才能像結構一樣使用它,以便能夠操作它,例如在這個偽代碼中執行:
System.out.println(t.element.valueInt);
System.out.println(t.element.firstNameString);
System.out.println(t.element.lastNameString);
我已經根據以前的一些帖子嘗試了不同的語法組合,但到目前為止還沒有一個工作。
對於添加了注釋的當前代碼版本,請檢查Gist 。
所有建議都深表感謝。
Comparable
是一個界面。 任何類都可以實現它。 由於樹只需要知道它的節點是如何比較的,因為Comparable
提供了這種知識,使用Comparable
就足夠了。
但是,對您來說可能還不夠,因為您可能想知道屬於Comparable
實現的其他屬性。 因此,您可以選擇使RedBlackNode
類對進入節點的項的確切類型進行通用 ,前提是它實現了Comparable
:
public class RedBlackTree <T extends Comparable<? super T>> {
private static class RedBlackNode {
...
T element;
}
}
其余代碼保持不變。 對於公開Comparable
的樹的方法,例如用於獲取節點信息的方法,請使用泛型類型T
創建RedBlackTree
時需要提供節點類型,如下所示:
RedBlackTree<MyClass> tree = new RedBlackTree<MyClass>();
當然, MyClass
必須實現Comparable
。 更改的總體效果是,當您的代碼從樹中獲取元素時,它是強類型的,允許您在沒有強制轉換的情況下訪問其方法和字段。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.