#java #dictionary #trie
#java #словарь #попробуйте
Вопрос:
привет, у меня есть проект, в котором мне нужно реализовать словарь с помощью tries… но теперь я не могу реализовать метод поиска …. мой код здесь
public class TriesNode {
String value;
ArrayList<TriesNode> children = new ArrayList<TriesNode>();
String findNode(TriesNode root , String key ){
for (int i=0 ; i<key.length() ; i){
char temp= key.charAt(i);
if ( !(root.children.equals(temp)))
return null;
else
root = root.children.value.equals(temp);
}
}
в этом коде у меня ошибка в инструкции else!!!!
я хочу заменить корень одним из дочерних элементов, чтобы его значение было похоже на первый символ ключа (temp), но я не могу этого сделать в «else statement» … и почему я не могу получить доступ к значению дочерних элементов??
Ответ №1:
Хорошо, root — это тип TriesNode, но root.children — это другой тип, вот в чем проблема. Вы не можете присваивать значения из разных типов. Вы должны объявить переменную типа root.children и затем присвоить это значение. Чтобы напрямую присвоить значение root.children для root, вы должны выполнить:
root.Add(root.children)
более или менее…
Комментарии:
1. я хочу заменить root на дочерние элементы, которые имеют правильное значение, но когда я пишу «children.value», я не могу получить доступ к too value. что я должен делать?
2. у вас есть arraylist, поэтому вам нужно будет выбрать один из дочерних элементов.get(i) // здесь i — это местоположение, которое вы хотите получить
Ответ №2:
root = root.children.value.equals (temp) не присваивает root.child root, скорее, он присваивает root значение true или false, потому что вы проверяете, равно ли оно temp или нет.
также Java не позволяет вам иметь оператор if, который возвращает значения разных типов из состояний if.
это вернет конечный корень в цепочке, это то значение, которое вы ищете?
попробуйте
TriesNode findFinalRoot(TriesNode root, String key){
if(key.length() == 0 )
return root;
for(int x = 0 ; x <root.children.lenth(); x )
if (key.charAt(0) == root.children.get(x).charAt(0)){
findFinalRoot(root,key.subString(1)); // here you loss first character
}
Комментарии:
1. я пытаюсь проверить, является ли первый символ ключа значением одного из дочерних элементов, затем заменяю root на этот дочерний элемент, а затем сравниваю второй символ ключа с дочерними элементами нового root …. у меня есть этот код на python, но я не могу преобразовать его в java «def find(node, key): для символа в ключе: если символа нет в node.children: не возвращайте ничего другого: node = node.children[char] возвращает node.value»
2. хорошо, что вам нужно сделать, это просмотреть весь массив дочерних элементов один за другим и проверить, совпадает ли значение. Я изменю свой ответ, чтобы отразить то, что у меня есть здесь
3. root.children.lenth() не определен для списка массивов, есть ли какой-либо способ получить длину arraylist? или я должен определить дочерние элементы в виде списка?