我知道有几个问题的题目与我的题目几乎完全相同,但是我调查了所有这些问题,他们的解决方案不适用于我的情况。我实施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
您正在使用,将其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
版权声明:本文内容由阿里云实名注册用户自发贡献,版权归原作者所有,阿里云开发者社区不拥有其著作权,亦不承担相应法律责任。具体规则请查看《阿里云开发者社区用户服务协议》和《阿里云开发者社区知识产权保护指引》。如果您发现本社区中有涉嫌抄袭的内容,填写侵权投诉表单进行举报,一经查实,本社区将立刻删除涉嫌侵权内容。