2012-04-07 23 views
1

私は、4つのタイプ(整数、ダブル、ストリング、キャラクタ)のうちの1つのみをとる汎用のマルチウェイツリーを作成しています。私は、匹敵するインターフェイスと私の挿入機能に問題があります。ここに私のコンソール出力されるマルチウェイツリーに匹敵するインターフェイスの問題

public class BTree<T extends Comparable<? super T>> 
{ 
    private int m=0, height=0, numkeys=0; 
    private BTreeNode<T> root; 
    boolean ready=false; 

class BTreeNode<T extends Comparable<? super T>> 
{ 
    boolean leaf = true; 
    int keyTally = 1; 
    Comparable<T> keys[] = new Comparable[m-1]; 
    BTreeNode<T> references[] = new BTreeNode[m]; 
    BTreeNode(T key) 
    { 
     keys[0] = (Comparable<T>) key; 
     for (int i=0; i<m; i++) 
      references[i] = null; 
    } 
} 

public BTree(int c) 
{ 
    root=null; 
    m=c; 
} 

// Not finished - can't test due to other bug 
public boolean insertElement(T elem) 
{ 
    insert(elem, root, height); 
    numkeys++; 
    return true; 
} 

// And now the ploblem function 

private BTreeNode<T> insert(T elem, BTreeNode<T> node, int hvar) 
{ 
    int i; 

    BTreeNode<T> temp = null; 

    if (hvar == 0) 
    { 
     for (i = 0; i < node.keyTally; i++) 
      if (elem.compareTo(node.keys[i]) < 0) 
       break; 
    } 
    else 
    { 
     for (i = 0; i < node.keyTally; i++) 
     { 
      if ((i+1 == node.keyTally) || elem.compareTo(node.keys[i]) < 0) 
      { 
       Node n = insert(elem, node.references[i++], hvar-1); 
       if (n == null) 
        return null; 

       temp.keys[0] = n.keys[0]; 
       temp.references[0] = n; 
       break; 
      } 
     } 
    } 

    for (int j = node.keyTally; j > i; j--) 
     node.keys[j] = node.keys[j-1]; 
    node.children[i] = temp; 
    node.keyTally++; 
    if (node.keyTally < m) 
     return null; 
    else 
    { 
     BTreeNode<T> newNode = null; 
     newNode.keyTally = m/2; 
     for(i=0; i<m/2; i++) 
     newNode.references[i] = node.references[m/2+i]; 
     return newNode; 
    } 
    return null; 
} 

そして:

BTree.java:169: error: method compareTo in interface Comparable<T#2> cannot be applied 
to given types; 
if (elem.compareTo(node.keys[i]) < 0) 
     ^
required: CAP#1 
found: Comparable<T#1> 
reason: actual argument Comparable<T#1> cannot be converted to CAP#1 by method 
invocation conversion 
where T#1,T#2 are type-variables: 
T#1 extends Comparable<? super T#1> declared in class BTree 
T#2 extends Object declared in interface Comparable 
where CAP#1 is a fresh type-variable: 
CAP#1 extends Object super: T#1 from capture of ? super T#1 

BTree.java:176: error: method compareTo in interface Comparable<T#2> cannot be 
applied to given types; 
if ((i+1 == node.keyTally) || elem.compareTo(node.keys[i]) < 0) 
           ^
required: CAP#1 
found: Comparable<T#1> 
reason: actual argument Comparable<T#1> cannot be converted to CAP#1 by 
method invocation conversion 
where T#1,T#2 are type-variables: 
T#1 extends Comparable<? super T#1> declared in class BTree 
T#2 extends Object declared in interface Comparable 
where CAP#1 is a fresh type-variable: 
CAP#1 extends Object super: T#1 from capture of ? super T#1 

BTree.java:178: error: cannot find symbol 
Node n = insert(elem, node.references[i++], hvar-1); 
^ 
symbol: class Node 
location: class BTree<T> 
where T is a type-variable: 
T extends Comparable<? super T> declared in class BTree 

BTree.java:191: error: cannot find symbol 
node.children[i] = temp; 
    ^
symbol: variable children 
location: variable node of type BTree<T>.BTreeNode<T> 
where T is a type-variable: 
T extends Comparable<? super T> declared in class BTree 

Note: Some input files use unchecked or unsafe operations. 
Note: Recompile with -Xlint:unchecked for details. 
4 errors 

私はそれを文句にするために同等のインターフェースと間違ってやっているのか理解していないここで私はこれまで書いてきた関連するコードですcompareToメソッドについてまた、文字列型を使用するとどうなるのでしょうか?アルファベット順にどれが最初に来るのかが分かると思います。ありがとう:)

答えて

1

これはnode.keys[i]Comparable<T>であり、Tではないからです。他の方法で比較を試してみてください。

+0

ありがとうございました!私は単純に 'elem.compareTo(node.keys [i])'を 'node.keys [i] .compareTo(elem)'に変更しなければなりませんでした。 – Tim

1

は、私はあなたがT[]Comparable<T>[]からkeysの種類を変更するのいずれかのことを示唆している(それはあなたにそれを使用したいものであるから、あなただけのクラスの外にそれを戻すために決して注意する必要があります)。または何かを得るたびに手動でTにキャストしてください:(T)node.keys[i]

関連する問題