2015-09-25 4 views
1

Я пытаюсь реализовать класс TreeMap, и у меня возникла проблема при помещении элементов в TreeMap. Вот код:Узел TreeMap имеет значение null после назначения

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

Проблема заключается в том, что, когда я исполняю эту линию:

node = new Node<>(key, value); 

узел всегда нуль. Я уже пробовал отлаживать код, но проблема не устранена.

Другие методы, которые я здесь не включал, потому что они работают.

+0

Это нуль сразу после выполнения этой строки или после возврата из 'rootPut()'? – gla3dr

ответ

0

У вас есть:

if(isEmpty()){ 
    node = new Node<>(key, value); 

, конечно, это должно быть

if(isEmpty()){ 
    head = new Node<>(key, value); 

NB: Это не исправить все свои ошибки, но это исправить мой head всегда null проблема.

+0

Но это не то же самое ?? В чем разница? –

+0

@JoacoTerniro - Нет! 'node' является локальной копией любого' head', содержащегося при вызове метода, поэтому, вероятно, имеет значение «null». 'head' - это переменная ** экземпляра ** в объекте. Используя 'head = new ...', вы меняете значение' head' вашего дерева - как хотите. Используя 'node = ...' вы ничего не меняете. – OldCurmudgeon

+0

Ой, ладно, я relatedvly новый в java, и я этого не знал. Большое спасибо! –

Смежные вопросы