Рекурсивный поиск слов в хэш-карте с использованием попыток - PullRequest
1 голос
/ 05 апреля 2019

Мой метод должен добавить связанную пару ключ / значение в базу данных, и если ключ уже находится в структуре, значение должно быть обновлено. Однако я не совсем уверен, что я делаю неправильно, это мой первый раз, используя попытки. Итак, я сейчас работаю над своим методом put и у меня есть следующее:

public void put(TrieMapNode current, String curKey, String value){
if(current.getChildren().containsKey(curKey))
      value = current.get(key);
      curKey =value;

  put(current.getChildren().get(curKey), curKey, value);

}

Любая помощь будет принята с благодарностью!

1 Ответ

0 голосов
/ 06 апреля 2019

В вашей текущей реализации вы не сможете воспользоваться преимуществами дерева.Это потому, что в корневом узле у вас есть один дочерний элемент для каждой встречаемой строки.
Это не способ построения дерева.Каждый узел вашего дерева может иметь не более одного дочернего элемента на символ (элементы, образующие строки).
Таким образом, ваш метод должен выглядеть примерно так:

public void put(TrieMapNode current, String key, String value, int depth){
if (depth == key.length()){
   current.value = value;
} else {
    char curChar = key.charAt(depth);
    if(!current.getChildren().containsKey(curChar)){
        TrieMapNode newNode = new TrieMapNode();
        current.getChildren().put(curChar, newNode);
    }
    put(current.getChildren().get(curChar), curKey, value, depth + 1);
}

Основная ошибка, которую вы сделали, заключалась в том, чтобыучитывайте ключ в целом при вставке / обновлении в свой файл.Это привело бы к тому, что корневой узел имел один дочерний узел для каждого ключа в вашей карте (таким образом, тонну детей), но с очень ограниченной глубиной (корневой узел, его дочерние элементы и все).

В предложенной вами реализации у узла есть один дочерний элемент на каждый возможный символ (ограниченное число, 26, 52, в любом случае небольшое и ограниченное число).
И его глубина не ограничена одним,потому что, как вы можете видеть в блоке else, мы создаем узел, если тот, который мы ищем, не существует (при запуске у вас есть только корневой узел, поэтому вам нужно спланировать случай, когда будет создан новый узел)и мы также вызываем рекурсивно put для дочернего элемента текущего узла.Таким образом, значение будет храниться на глубине, равной длине его ключа.

...