按字符递归地向LinkedHashMap字符添加单词

时间:2018-03-10 02:26:31

标签: java recursion

我正在尝试编写一个可以输入单词的类,并且将根据输入的单词创建一个字符树。然后可以检查树是否存在某个单词。我的问题是我只能从任何单词中保存一个字符 - 如果一个单词有多个字符,则只保存第一个字符(我非常确定包含方法是正确的)。这是我的代码,但显然有些错误,但是我无法说出:

public class Dictionary {

  private Map<Character, DictionaryTree> children = new LinkedHashMap<>();
  private boolean endOfWord;

  DictionaryTree() {
    endOfWord = false;
  }

  void insert(String word) {
    if (!contains(word)) {
      DictionaryTree newDictionaryTree = new DictionaryTree();
      if (word.length() > 1) {
        newDictionaryTree.insert(word.substring(1, word.length()));
      } else if (word.length() == 1) {
        newDictionaryTree.endOfWord = true;
      }
      children.put(word.charAt(0), newDictionaryTree);
    }
  }

  boolean contains(String word) {
    if (word.length() > 0) {
      // Check if first letter is a child node
      if (children.containsKey(word.charAt(0))) {
        if (word.length() > 1) {
          DictionaryTree extractedDictionaryTree = children.get(word.charAt(0));
          extractedDictionaryTree.contains(word.substring(1, word.length()));
        }
        // If only one character left, check if end of word
        else if (children.get(word.charAt(0)).endOfWord == true) {
          return true;
        } else {
          return false;
        }
      }
      return false;
    }

    return false;
  }
}

非常感谢任何帮助。

1 个答案:

答案 0 :(得分:0)

根据您的要求,您希望搜索单词,如果它存在与否。 您将使用LinkedHashmap来实现它,但您尝试使用Trie数据结构。这提供了有效的方式来插入以及以有效的方式搜索字符串或任何数据。

源代码来自GeeksForGeeks

                   root
                /   \    \
                t   a     b
                |   |     |
                h   n     y
                |   |  \  |
                e   s  y  e
             /  |   |
             i  r   w
             |  |   |
             r  e   e
                    |
                    r

<强>实施

// Java implementation of search and insert operations
// on Trie
public class Trie {

    // Alphabet size (# of symbols)
    static final int ALPHABET_SIZE = 26;

    // trie node
    static class TrieNode
    {
        TrieNode[] children = new TrieNode[ALPHABET_SIZE];

        // isEndOfWord is true if the node represents
        // end of a word
        boolean isEndOfWord;

        TrieNode(){
            isEndOfWord = false;
            for (int i = 0; i < ALPHABET_SIZE; i++)
                children[i] = null;
        }
    };

    static TrieNode root; 

    // If not present, inserts key into trie
    // If the key is prefix of trie node, 
    // just marks leaf node
    static void insert(String key)
    {
        int level;
        int length = key.length();
        int index;

        TrieNode pCrawl = root;

        for (level = 0; level < length; level++)
        {
            index = key.charAt(level) - 'a';
            if (pCrawl.children[index] == null)
                pCrawl.children[index] = new TrieNode();

            pCrawl = pCrawl.children[index];
        }

        // mark last node as leaf
        pCrawl.isEndOfWord = true;
    }

    // Returns true if key presents in trie, else false
    static boolean search(String key)
    {
        int level;
        int length = key.length();
        int index;
        TrieNode pCrawl = root;

        for (level = 0; level < length; level++)
        {
            index = key.charAt(level) - 'a';

            if (pCrawl.children[index] == null)
                return false;

            pCrawl = pCrawl.children[index];
        }

        return (pCrawl != null && pCrawl.isEndOfWord);
    }

    // Driver
    public static void main(String args[])
    {
        // Input keys (use only 'a' through 'z' and lower case)
        String keys[] = {"the", "a", "there", "answer", "any",
                         "by", "bye", "their"};

        String output[] = {"Not present in trie", "Present in trie"};


        root = new TrieNode();

        // Construct trie
        int i;
        for (i = 0; i < keys.length ; i++)
            insert(keys[i]);

        // Search for different keys
        if(search("the") == true)
            System.out.println("the --- " + output[1]);
        else System.out.println("the --- " + output[0]);

        if(search("these") == true)
            System.out.println("these --- " + output[1]);
        else System.out.println("these --- " + output[0]);

        if(search("their") == true)
            System.out.println("their --- " + output[1]);
        else System.out.println("their --- " + output[0]);

        if(search("thaw") == true)
            System.out.println("thaw --- " + output[1]);
        else System.out.println("thaw --- " + output[0]);

    }
}

希望它有所帮助!!!