Я пытаюсь реализовать очень простую Trie в Java, которая поддерживает 3 операции. Я бы хотел, чтобы у него был метод insert, есть метод (т. Е. Это определенное слово в trie) и метод toString для возврата trie в строковой форме. Я считаю, что у меня правильно работает вставка, но есть и toString, которые оказались трудными. Вот что я до сих пор.Trie implementation
Три класса.
public class CaseInsensitiveTrie implements SimpleTrie {
//root node
private TrieNode r;
public CaseInsensitiveTrie() {
r = new TrieNode();
}
public boolean has(String word) throws InvalidArgumentUosException {
return r.has(word);
}
public void insert(String word) throws InvalidArgumentUosException {
r.insert(word);
}
public String toString() {
return r.toString();
}
public static void main(String[] args) {
CaseInsensitiveTrie t = new CaseInsensitiveTrie();
System.out.println("Testing some strings");
t.insert("TEST");
t.insert("TATTER");
System.out.println(t.has("TEST"));
}
}
И узел класса
public class TrieNode {
//make child nodes
private TrieNode[] c;
//flag for end of word
private boolean flag = false;
public TrieNode() {
c = new TrieNode[26]; //1 for each letter in alphabet
}
protected void insert(String word) {
int val = word.charAt(0) - 64;
//if the value of the child node at val is null, make a new node
//there to represent the letter
if (c[val] == null) {
c[val] = new TrieNode();
}
//if word length > 1, then word is not finished being added.
//otherwise, set the flag to true so we know a word ends there.
if (word.length() > 1) {
c[val].insert(word.substring(1));
} else {
c[val].flag = true;
}
}
public boolean has(String word) {
int val = word.charAt(0) - 64;
if (c[val]!=null && word.length()>1) {
c[val].has(word.substring(1));
} else if (c[val].flag==true && word.length()==1) {
return true;
}
return false;
}
public String toString() {
return "";
}
}
Так в основном, при создании TRIE, TrieNode создается как корень с 26 детьми. Когда попытка вставки выполняется, вставка вызывается в этом корневом узле, который рекурсивно создает новый узел в правильном положении и продолжается до тех пор, пока слово не будет завершено. Я считаю, что этот метод работает правильно.
У меня есть функция очень сломанная, потому что у меня есть, чтобы иметь эту инструкцию возврата за пределами скобок по какой-то причине. Я не могу содержать его в предложении else или компилятор жалуется. Помимо этого, я думаю, что метод должен работать с некоторыми настройками, но я не могу понять это для жизни меня.
toString - это зверь, с которым я пытался справиться, но ничто не бросает на него, поэтому я оставлю это до тех пор, пока не решит проблему. Если у меня есть работа, я могу составить способ переформатировать ее в функцию toString.
Цель int val = word.charAt (0) - 64; потому что каждая введенная строка должна быть все шапки (я буду создавать функцию форматирования строк, чтобы гарантировать это впоследствии), поэтому значение int первой буквы - 64 будет ее позицией в массиве. т.е. индекс массива 0 равен A, поэтому A = 64, A - 64 = 0. B = 65, B - 64 = 1 и т. д.
Вместо: 'INT = Вэл word.charAt (0) - 64;' вы делаете: 'INT = слово Вэл .charAt (0) - 'A'; '! –
Есть ли какая-то причина, почему ваше трио 26-арный? Почему вы ограничиваете себя только прописными буквами США?Что произойдет, если какой-либо из ключей имеет пробелы или (Odin forbid) международные символы в них? – Enno
Вот моя реализация, в том числе addWord, getWordNumber, listAllDistinctWords, см. Ее через: https://github.com/shaogbi/Java/blob/master/datastructure/MyTrie.java – coderz