开发者社区> 问答> 正文

即使该元素存在于HashMap中,HashMap.get()方法仍返回null

我知道有几个问题的题目与我的题目几乎完全相同,但是我调查了所有这些问题,他们的解决方案不适用于我的情况。我实施Trie的Java,主要Trie类有一个HashMap映射TrieNode的到LinkedList的,类似映射父节点给它的孩子,和另一个HashMap映射LinkedList到一个TrieNode,获得与孩子的父节点。然而,在insert(String s)方法中,HashMap映射LinkedList的到TrieNode的是生产一个空指针,当我试图使用get()方法。我使用调试器调查了此问题,但在调试器中说LinkedList存在。这是我的代码: 主要测试类:

public static void main(String[] args) {
    Trie trie = new Trie();
    trie.insert("abcd");
    trie.insert("abce");
    trie.insert("abc"); // When I insert "abc", it gives the error.
}

本Trie类

public class Trie {

    public HashMap<TrieNode, LinkedList<TrieNode>> children;
    public HashMap<LinkedList<TrieNode>, TrieNode> nodes;

    public Trie() {
        TrieNode root = new TrieNode(' ');
        LinkedList<TrieNode> list = new LinkedList<>();

        children = new HashMap<>();
        children.put(root, list);

        nodes = new HashMap<>();
        nodes.put(list, root);
    }

    public void insert(String word) {
        TrieNode parent = new TrieNode(' ');
        TrieNode curr = null;
        LinkedList<TrieNode> children = this.children.get(parent);
        char[] chars = word.toCharArray();

        for (int i = 0; i < chars.length; i++) {
            curr = new TrieNode(chars[i]);

            if (children.contains(curr)) {
                children = this.children.get(curr);
            } else {
                LinkedList<TrieNode> newList = new LinkedList<>();

                this.children.get(parent).add(curr);
                this.children.put(curr, newList);
                nodes.put(newList, curr);
                children = this.children.get(curr);
            }

            parent = new TrieNode(chars[i]);
        }

        if (word.equals("abc")) {
            for (LinkedList<TrieNode> currList : nodes.keySet()) {
                if (currList.equals(children)) {
                    System.out.println("Found");
                }
            }

            // I did further investigation on why it produces null on when the string "abc" is passed, and strangely enough, in my output it printed "Found".
        }

        nodes.get(children).count++; // This is where the null pointer exception occurs.
    }
}

本TrieNode类:

public class TrieNode {

    public char val;
    public int count;

    public TrieNode(char val) {
        this.val = val;
    }

    @Override
    public String toString() {
        return val + "";
    }

    @Override
    public boolean equals(Object o) {
        if (this == o) return true;
        if (o == null || getClass() != o.getClass()) return false;
        TrieNode trieNode = (TrieNode) o;
        return val == trieNode.val;
    }

    @Override
    public int hashCode() {
        return Objects.hash(val);
    }

}

当我尝试插入“ abc”时发生错误。在Trie该类中,我尝试HashMap在给定的字符串为“ abc”时打印“ Found”(如果所包含的键),并且奇怪的是,它确实进行了打印。因此HashMap的keySet()方法包含正确的键,但是当我调用该get()方法时它返回null ?有人可以找出正在发生的事情吗?


问题来源:stackoverflow

展开
收起
七天一失眠 2020-03-21 11:34:04 993 0
1 条回答
写回答
取消 提交回答
  • 做一个优秀的阿里云志愿者

    您正在使用,将其LinkedList用作键HashMap,并且您说的是变异LinkedList:这可能就是为什么您使用keySet()和不使用时找到键的原因Map.get(Object):

    this.children.get(parent).add(curr);
    

    举个例子:

    
    Map<List<String>, String> map = new HashMap<>();
    List<String> list = new ArrayList<>();
    map.put(list, "a"); 
    System.out.println("map.get(" + list + "): " + map.get(list));
    list.add("b");
    System.out.println("map.get(" + list + "): " + map.get(list)); // may be null
    

    原因很简单: - HashMap使用hashCode()来寻找值区的值区。变化的内容List类似于变化hashCode()。 - HashMap然后使用equals()来找到等效的密钥。更改列表的内容会产生相同的结果。


    答案来源:stackoverflow

    2020-03-21 11:35:53
    赞同 展开评论 打赏
问答排行榜
最热
最新

相关电子书

更多
低代码开发师(初级)实战教程 立即下载
冬季实战营第三期:MySQL数据库进阶实战 立即下载
阿里巴巴DevOps 最佳实践手册 立即下载