Estou tentando implementar unha trie moi sinxela en Java que admite 3 operacións. Gustaríame ter un método de inserción, un método ten (é dicir, unha palabra determinada no Trie) e un método de tosting para devolver a trie en forma de cadea. Creo que a inserción funciona correctamente, pero ten e tostring é difícil. Isto é o que teño ata agora. Trie
a 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")); } }
e o 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; //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 == null) { c = 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.insert(word.substring(1)); } else { c.flag = true; } } public boolean has(String word) { int val = word.charAt(0) - 64; if (c!=null && word.length()>1) { c.has(word.substring(1)); } else if (c.flag==true && word.length()==1) { return true; } return false; } public String toString() { return ""; } }
Así, basicamente, ao crear unha trie, créase un trineo como a raíz con 26 nenos. Ao tentar inserir, é invocado a ese nodo raíz, que crea recursivamente un novo nodo na posición correcta e continúa ata que se completa a palabra. Creo que ese método funciona correctamente.
A miña función está moi rota, porque teño que ter esa declaración de regreso fóra dos parénteses por algún motivo. Non podo conterlo dentro dunha cláusula de outra persoa ou o compilador queixa. Ademais diso, estou pensando que o método debería funcionar con algúns axustes, pero non podo solucionalo por mor da miña vida.
tosting é unha besta que intentei abordar, pero nada do que iso Lanzamento funciona, entón o que deixo ata que resolva o problema. Se o teño funciona, podo atopar un xeito de reformalo nunha función de tosting.
O propósito de int val = word.charat (0) – 64; É porque cada cadea admitida debe ser maiúscula (vou crear unha función de formato de cadea para garantir isto) para que o valor int da primeira letra – 64 sexa a súa posición na matriz. É dicir, a taxa de matriz 0 é a, entón a = 64, a – 64 = 0. b = 65, b – 64 = 1, e así por diante.