Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/324.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_Generics_B Tree_Multiway Tree - Fatal编程技术网

Java 多路树可比接口问题

Java 多路树可比接口问题,java,generics,b-tree,multiway-tree,Java,Generics,B Tree,Multiway Tree,我正在创建一个通用的多路树,我知道它只接受四种类型(整数、双精度、字符串和字符)中的一种。我的可比接口和插入函数有问题。以下是我迄今为止编写的相关代码: public class BTree<T extends Comparable<? super T>> { private int m=0, height=0, numkeys=0; private BTreeNode<T> root; boolean ready=false; cl

我正在创建一个通用的多路树,我知道它只接受四种类型(整数、双精度、字符串和字符)中的一种。我的可比接口和插入函数有问题。以下是我迄今为止编写的相关代码:

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;
}

public class BTree这是因为
node.key[i]
的类型是
compariable
,而不是
T
。试着用另一种方式进行比较。

我建议您要么将
键的类型
Comparable[]
更改为
T[]
(因为这是您想要使用的;您只需小心不要将其返回到类外);或者,每次您从中获得一些信息时,您都可以手动将其转换为
T
(T)node.keys[i]

谢谢您的回复!我只需将
elem.compareTo(node.keys[I])
更改为
node.keys[I].compareTo(elem)
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