java - 用 Java 实现 map

标签 java variable-assignment

我目前正在做一项作业,要求我在 Java 中创建一个 Map 类,并且在使用“put”方法时遇到了一个错误,我似乎无法修复该错误。本质上,当测试运行时, map 中的新节点将不会被创建,我似乎无法弄清楚为什么。预先感谢您!

类(class):

public class MyMap<K extends Comparable<K>, V> {
private class MapNode {
    private K key;
    private V value;
    private MapNode left;
    private MapNode right;

    public MapNode(K theKey, V theValue) {
        key = theKey;
        value = theValue;
        left = null;
        right = null;
    }
}

private MapNode root;

public MyMap() {
    root = null;
}

/**
 * Associates key to value and stores mapping If key exists, replaces value
 * with a new value
 * 
 * @param key
 * @param value
 * @return value replaced; null if no value
 */

public V put(K key, V value) {
    return put(key, value, root);
}

private V put(K key, V value, MapNode ref) {
    V temp;
    if (ref == null) {
        ref = new MapNode(key, value);
        return null;
    } else {
        if (ref.key.compareTo(key) == 0) {
            temp = ref.value;
            ref.value = value;
            return temp;
        } else if (key.compareTo(ref.key) < 0)
            return put(key, value, ref.left);
        else
            return put(key, value, ref.right);
    }
}

/**
 * Return value to which key is mapped
 * 
 * @param key
 * @return value of key; null
 */

public V get(K key) {
    return get(key, root);
}

private V get(K key, MapNode ref) {
    if (ref == null) {
        return null;
    } else {
        if (ref.key.compareTo(key) == 0)
            return ref.value;
        else if (key.compareTo(ref.key) < 0)
            return get(key, ref.left);
        else if (key.compareTo(ref.key) > 0)
            return get(key, ref.right);
        else
            return null;
    }
}

/**
 * Returns true if Map already uses the key
 * 
 * @param key
 * @return true; false
 */

public boolean containsKey(K key) {
    return containsKey(key, root);
}

private boolean containsKey(K key, MapNode ref) {
    if (ref == null) {
        return false;
    } else {
        if (ref.key.compareTo(key) == 0)
            return true;
        else if (key.compareTo(ref.key) < 0)
            return containsKey(key, ref.left);
        else if (key.compareTo(ref.key) > 0)
            return containsKey(key, ref.right);
        else
            return false;
    }
}
}

测试:

import org.junit.Test;

import static org.junit.Assert.assertEquals;
import static org.junit.Assert.assertFalse;
import static org.junit.Assert.assertTrue;

public class MyMapTest {
@Test
public void testMyMap(){
    MyMap<String, Integer> m = new MyMap<String, Integer>();

    assertFalse(m.containsKey("one"));
    assertEquals(null, m.get("one"));
    assertEquals(null, m.put("one", 1));
    assertTrue(m.containsKey("one"));
}
}

最佳答案

put(K key, V value, MapNode ref) 方法中,您将一个新的 MapNode 分配给包含要添加的节点的 ref

我看到您通过传递root来调用该方法。这会存储 refroot 中存储的相同引用。这意味着,如果 root 不为空。但是,由于 rootnull,因此它们都指向 null

当您分配ref = new MapNode(key, value);时,您将ref指向新节点,但root仍然指向为空。

您需要将 root 指向新的 MapNode,将 ref 指向它并不适合您。

关于java - 用 Java 实现 map ,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10235996/

相关文章:

java - 如何使用 Gremlin 和 Java 查询远程 Apache Tinkerpop 图形数据库?

java - 符号变量错误和不兼容类型错误

java - 我在 JSoup 中收到不同的 HTML 文档

c - 声明中使用的 * 运算符 (int *p = &i) 和表达式 (*p = &i) 之间有什么区别

c++ - 带矩阵的赋值运算符(=)返回垃圾值

shell - 该命令有什么问题...您能找到此命令中的错误吗?

arrays - Powershell 数组赋值分配变量,而不是值?

java - FLAC或OGG在线媒体播放器

java - OpenGL加载和渲染png到屏幕

objective-c - "Expression is not assignable"-- 在 Xcode 中将 float 分配为其他两个 float 的总和时出现问题?