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

Java 树映射节点在分配后为空

Java 树映射节点在分配后为空,java,dictionary,tree,treemap,Java,Dictionary,Tree,Treemap,我试图实现TreeMap类,但在将元素放入TreeMap时遇到了一个问题。代码如下: public class TreeMap<K,V> implements Map<K,V> { private Comparator<K> comparator; private int size; private Node<K,V> head; public TreeMap(Comparator<K> compar

我试图实现TreeMap类,但在将元素放入TreeMap时遇到了一个问题。代码如下:

public class TreeMap<K,V> implements Map<K,V> {

    private Comparator<K> comparator;
    private int size;
    private Node<K,V> head;

    public TreeMap(Comparator<K> comparator){
        this.comparator = comparator;
        size = 0;
    }

    @Override
    public int size() {
        return size;
    }

    @Override
    public boolean isEmpty() {
        return size == 0;
    }

    @Override
    public V put(K key, V value) {
        return rootPut(head, key, value);
    }

    private V rootPut(Node<K,V> node, K key, V value){
        if(isEmpty()){
            node = new Node<>(key, value);
            size++;
            return null;
        }
        int compare = comparator.compare(head.key, key);

        if(compare == 0){
            V auxValue = node.value;
            node.value = value;
            size++;
            return auxValue;
        } else if(compare > 0){
            return rootPut(node.right, key, value);
        } else{
            return rootPut(node.left, key, value);
        }
    }
}
公共类树映射实现映射{
专用比较器;
私有整数大小;
专用节点头;
公共树映射(比较器-比较器){
这个比较器=比较器;
尺寸=0;
}
@凌驾
公共整数大小(){
返回大小;
}
@凌驾
公共布尔值为空(){
返回大小==0;
}
@凌驾
公共V输入(K键,V值){
返回rootPut(头、键、值);
}
私有V根输出(节点,K键,V值){
if(isEmpty()){
节点=新节点(键、值);
大小++;
返回null;
}
int compare=comparator.compare(head.key,key);
如果(比较==0){
AUxV值=node.value;
node.value=值;
大小++;
返回auxValue;
}否则如果(比较>0){
返回rootPut(node.right、key、value);
}否则{
返回rootPut(node.left、key、value);
}
}
}
问题是,当我执行这一行时:

node = new Node<>(key, value);
node=新节点(键、值);
节点始终为空。我已经试过调试代码,但问题仍然存在

这里没有包括其他方法,因为它们很有效。

您有:

if(isEmpty()){
    node = new Node<>(key, value);
if(isEmpty()){
节点=新节点(键、值);
当然应该是这样

if(isEmpty()){
    head = new Node<>(key, value);
if(isEmpty()){
head=新节点(键、值);
注意:这并不能修复您所有的bug,但它确实修复了my
head
总是
null
的问题。

您有:

if(isEmpty()){
    node = new Node<>(key, value);
if(isEmpty()){
节点=新节点(键、值);
当然应该是这样

if(isEmpty()){
    head = new Node<>(key, value);
if(isEmpty()){
head=新节点(键、值);

注意:这并不能修复您所有的bug,但它确实修复了my
head
总是
null
的问题。

是在该行执行后立即为null,还是在从
rootPut()返回后立即为null?是在该行执行后立即为null,还是从
rootPut()返回后为null
?但不一样??这是不同的地方???@joacoteriro-不!
节点是调用方法时包含的
的本地副本,因此可能
是对象中的实例变量。通过使用
头=新…
可以更改对象的
值树-如你所愿。使用
node=…
你不会改变任何东西。哦,好吧,我在java中很新,我不知道。非常感谢!@joacoteriro-一些很好的解释。但是不一样吗?这是什么区别呢?@joacoteriro-不!
node
是方法创建时包含的
头的本地副本调用so可能是
null
head
是对象中的实例变量。通过使用
head=new…
您可以更改树的
head
值-如您所愿。使用
node=…
您不会更改任何内容。哦,好的,我在java中是一个新的,我不知道。非常感谢!@joacterniro-Som我有很好的解释。