Estoy intentando implementar un Trie muy simple en Java que admite 3 operaciones. Me gustaría tener un método insert, un método has (es decir, una palabra determinada en el trie) y un método toString para devolver el trie en forma de cadena. Creo que la inserción funciona correctamente, pero has y toString están resultando ser difíciles. Esto es lo que tengo hasta ahora.Implementación de Trie
La clase trie.
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"));
}
}
Y el nodo de clase
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 "";
}
}
Así que, básicamente, al crear un trie, un TrieNode se crea como la raíz con 26 niños. Cuando se intenta insertar, se invoca a ese nodo raíz, que recursivamente crea un nuevo nodo en la posición correcta, y continúa hasta que la palabra se completa. Creo que ese método está funcionando correctamente.
Mi función tiene muy rota, porque I tiene para tener esa declaración de devolución fuera de los paréntesis por alguna razón. No puedo contenerlo dentro de una cláusula else o el compilador se queja. Aparte de eso, estoy pensando que el método debería funcionar con algunos ajustes, pero no puedo resolverlo por mi vida.
toString es una bestia que he intentado abordar, pero nada de lo que arroje funciona, así que lo dejo hasta que resuelva el problema. Si tengo funciona, puedo encontrar una manera de reformatearlo en una función toString.
El propósito de int val = word.charAt (0) - 64; es porque cada cadena ingresada debe ser mayúscula (crearé una función de formateo de cadena para asegurar esto luego) para que el valor int de la primera letra - 64 sea su posición en la matriz. es decir, el índice de matriz 0 es A, entonces A = 64, A - 64 = 0. B = 65, B - 64 = 1, y así sucesivamente.
En lugar de: 'int val = word.charAt (0) - 64;' lo hace: 'int val = palabra .charAt (0) - 'A'; '! –
¿Hay alguna razón por la cual tu trie tenga 26 años? ¿Por qué te limitas solo a letras mayúsculas de EE. UU.?¿Qué sucede si alguna de las teclas tiene espacios o (Odin no lo permite) caracteres internacionales en ellas? – Enno
Aquí está mi implementación, incluyendo addWord, getWordNumber, listAllDistinctWords, ver a través de: https://github.com/shaogbi/Java/blob/master/datastructure/MyTrie.java – coderz