【发布时间】:2016-11-08 08:01:23
【问题描述】:
我不熟悉尝试和测试它的工作原理。现在我正在建立一个联系人列表。我将“Prashanth”和“Pradep”添加到特里,当我搜索“Pra”时,我应该收到两个计数。我的方法是在每个节点中都有变量 size 并在找到相同长度的字符串时返回它。有一些不必要的东西/变量,如有效载荷等,我用于调试。我发现的问题是,当我在 hashmap 中存储一个字符和一个节点时,会存储空节点。所以我一直得到 0 作为答案。
public class tries {
public static class Node {
HashMap<Character, Node> children = new HashMap<>();
boolean endOfWord = false;
int size =0;
int payload = 10;
public void setNode(char c, Node n) {
children.put(c,n);
}
public Node getNode(char c) {
return children.get(c);
}
public void addNode( String s,int index) {
Node current = children.get(s.charAt(index));
size++;
if(index ==s.length()-1)
{
endOfWord = true;
return;
}
if(current== null)
{
current.payload = 11;
this.setNode(s.charAt(index),current);
}
addNode(s,index+1);
}
public int findcount(String s, int index) {
Node current = children.get(s.charAt(index));
if(index ==s.length()-1)
{
current.endOfWord = true;
return current.size;
}
if(current == null)
{
return 0;
}
return findcount(s,index+1);
}
}
public static void main(String args[])
{
String c1 = "Prashanth";
String c2= "Pradep";
Node n = new Node();
//tries t = new tries();
n.addNode(c1,0);
n.addNode(c2,0);
System.out.println(n.findcount("Pra",0));
}
}
如果我运行此代码,我会得到错误。 (如果我稍微改变一下,我会得到 0)
Exception in thread "main" java.lang.NullPointerException
at tries$Node.addNode(tries.java:35)
at tries.main(tries.java:66)
at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:57)
at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
at java.lang.reflect.Method.invoke(Method.java:606)
at com.intellij.rt.execution.application.AppMain.main(AppMain.java:147)
【问题讨论】:
-
那么,您是否收到 NullPointerException 异常?如果是,则发布其堆栈跟踪;如果不是,请更改问题的标题。
-
问题出在
addNode中,this.setNode(s.charAt(index),current);的第一个当前行将是 空节点,您将其设置在children哈希中。 -
您要搜索联系人吗?换一种方式可以吗?
-
@SunilBN:我明白了。所以我尝试使用有效负载初始化并添加一些数据。虽然我没有得到它
-
@JBNizet:已发布