所以我正在测试一些来自互联网的关于Digital Tries的代码,我有一个项目,我一直坚持这个,因为我尝试的一切都会返回这个错误:
Exception in thread "main" java.lang.ArrayIndexOutOfBoundsException: -13
这是我找到此代码(Code Source)
的地方TrieNode.java
class TrieNode {
TrieNode[] arr;
boolean isEnd;
// Initialize your data structure here.
public TrieNode() {
this.arr = new TrieNode[26];
}
}
Trie.java
public class Trie {
private TrieNode root;
public static void main(String[] args) {
Trie tr = new Trie();
tr.insert("TEST");
System.out.println("TEST " + tr.search("TEST"));
}
public Trie() {
root = new TrieNode();
}
// Inserts a word into the trie.
public void insert(String word) {
TrieNode p = root;
for(int i=0; i<word.length(); i++){
char c = word.charAt(i);
int index = c-'a';
if(p.arr[index]==null){
TrieNode temp = new TrieNode();
p.arr[index]=temp;
p = temp;
}else{
p=p.arr[index];
}
}
p.isEnd=true;
}
// Returns if the word is in the trie.
public boolean search(String word) {
TrieNode p = searchNode(word);
if(p==null){
return false;
}else{
if(p.isEnd)
return true;
}
return false;
}
// Returns if there is any word in the trie
// that starts with the given prefix.
public boolean startsWith(String prefix) {
TrieNode p = searchNode(prefix);
if(p==null){
return false;
}else{
return true;
}
}
public TrieNode searchNode(String s){
TrieNode p = root;
for(int i=0; i<s.length(); i++){
char c= s.charAt(i);
int index = c-'a';
if(p.arr[index]!=null){
p = p.arr[index];
}else{
return null;
}
}
if(p==root)
return null;
return p;
}
}
输出:
Exception in thread "main" java.lang.ArrayIndexOutOfBoundsException: -13
at Trie.insert(Trie.java:20)
at Trie.main(Trie.java:6)
编译:
javac TrieNode.java Trie.java
java Trie
任何解决问题的想法?
答案 0 :(得分:3)
int index = c - 'a'
正在'T'
循环的第一次迭代中处理char for
。
就char
值而言,'T' - 'a' = -13
,因此index = -13
会在检查数组时抛出异常。
修改强>
您的解决方案无效,因为您使用的是大写字母。在文章中,程序仅使用'a'到'z'。您可以轻松更改代码以适应这一点:
char c = Character.toLowerCase(word.charAt(i));
答案 1 :(得分:-1)
public TrieNode searchNode(String s){
TrieNode p = root;
for(int i=0; i<s.length()-1; i++){
char c= s.charAt(i);
int index = c-'a';
if(p.arr[index]!=null){
p = p.arr[index];
}else{
return null;
}
}
if(p==root)
return null;
return p;
}