我正在尝试帮助朋友在Java中实现Trie结构,尽管我的编程不是很好,请沿着我的Java。我在这里找到了一个实现,并试图在Idea Intellij上运行它。
我收到的错误是
Error:(87, 41) java: cannot find symbol
symbol: method getWords()
location: variable children of type com.company.TrieNode[]
我不确定从哪里开始故障排除此错误。我感觉可能与循环有关吗?我想在分析该代码之前运行代码,但是此错误是一个障碍。
我已经在Intellij中尝试了File > Invalidate Caches/Restart
,但是它出现了相同的错误。我认为这可能是一个Java问题。
以下是我拥有的(上述链接的信用),
main.java
package com.company;
public class Main {
public static void main(String[] args) {
Trie myTrie = new Trie();
myTrie.addWord("Khalid");
}
}
trie.java
package com.company;
import java.util.ArrayList;
import java.util.List;
/**
* Created by Khalid on 5 December.
*/
public class Trie
{
private TrieNode root;
/**
* Constructor
*/
public Trie()
{
root = new TrieNode();
}
/**
* Adds a word to the Trie
* @param word
*/
public void addWord(String word)
{
root.addWord(word.toLowerCase());
}
/**
* Get the words in the Trie with the given
* prefix
* @param prefix
* @return a List containing String objects containing the words in
* the Trie with the given prefix.
*/
public List getWords(String prefix)
{
//Find the node which represents the last letter of the prefix
TrieNode lastNode = root;
for (int i=0; i<prefix.length(); i++)
{
lastNode = lastNode.getNode(prefix.charAt(i));
//If no node matches, then no words exist, return empty list
if (lastNode == null) return new ArrayList();
}
//Return the words which eminate from the last node
return lastNode.getWords();
}
}
trienode.java
package com.company;
import java.util.ArrayList;
import java.util.List;
/**
* Created by Khalid on 5 December.
*/
public class TrieNode {
private TrieNode parent;
private TrieNode[] children;
private boolean isLeaf; //Quick way to check if any children exist
private boolean isWord; //Does this node represent the last character of a word
private char character; //The character this node represents
/**
* Constructor for top level root node.
*/
public TrieNode() {
children = new TrieNode[26];
isLeaf = true;
isWord = false;
}
/**
* Constructor for child node.
*/
public TrieNode(char character) {
this();
this.character = character;
}
/**
* Adds a word to this node. This method is called recursively and
* adds child nodes for each successive letter in the word, therefore
* recursive calls will be made with partial words.
*
* @param word the word to add
*/
protected void addWord(String word) {
isLeaf = false;
int charPos = word.charAt(0) - 'a';
if (children[charPos] == null) {
children[charPos] = new TrieNode(word.charAt(0));
children[charPos].parent = this;
}
if (word.length() > 1) {
children[charPos].addWord(word.substring(1));
} else {
children[charPos].isWord = true;
}
}
/**
* Returns the child TrieNode representing the given char,
* or null if no node exists.
*
* @param c
* @return
*/
protected TrieNode getNode(char c) {
return children[c - 'a'];
}
/**
* Returns a List of String objects which are lower in the
* hierarchy that this node.
*
* @return
*/
protected List getWords() {
//Create a list to return
List list = new ArrayList();
//If this node represents a word, add it
if (isWord) {
list.add(toString());
}
//If any children
if (!isLeaf) {
//Add any words belonging to any children
for (int i = 0; i < children.length; i++) {
if (children[i] != null)
list.addAll(children.getWords());
}
}
return list;
}
/**
* Gets the String that this node represents.
* For example, if this node represents the character t, whose parent
* represents the charater a, whose parent represents the character
* c, then the String would be "cat".
*
* @return
*/
public String toString() {
if (parent == null) {
return "";
} else {
return parent.toString() + new String(new char[]{character});
}
}
}
您的代码正在尝试在children
上调用getWords()
,即TrieNode
的 array 。大概的目的是收集每个子节点的结果。由于您已经处于循环状态,因此您只需要更新代码即可引用当前项目:
list.addAll(children[i].getWords());