2015-04-01 90 views
2

我正在嘗試從樹形狀的.txt文件創建一本詞典。在文本文件的每一行都有一個單詞,我提取數組中的所有單詞。用Javascript/PHP創建詞典

現在關於樹,每個節點都包含一個字母,如果它是一個單詞的最後一個字母,它包含一個定義,並且每個節點都有一個數組Children,它包含所有其他字以相同方式開頭的字母。

所以我有這樣定義的節點:

function Node(letter,definition,children) { 
    this.letter = letter, 
    this.definition = "", 
    this.children = [] 
}; 

我有一個數組字典將包含所有的節點。每個節點都將被組織(以便我們知道'a'在詞典[0]中,'b'在詞典[1]中等等)。

我定義了一些功能,以幫助建立詞典:

  • 檢查,如果字典包含了我們有這個詞的第一個字母(C是字符,dictio中是字典陣列和ASCII是ascii-字符的97值)

    function checkChar(c,dictio,ascii){ 
        if(dictio[ascii].letter == c){ 
         return true; 
        } 
        return false; 
    }; 
    
    • 創建節點與給定的字符

      function createChar(c){ 
      
          var noeud = { 
           letter: c, 
           def: '', 
           children: [] 
          }; 
      
          return noeud; 
      }; 
      
  • 的字符添加到詞典

    功能addChar(C,dictio中,ASCII){ dictio.children [ASCII] = createChar(C); };

  • 而我在最大的功能上遇到了麻煩:主要是增加了這個詞,並調用了我寫的所有這些小函數。我有麻煩製作。

我甚至不知道我在做什麼是對還是錯,如果任何人都可以點我朝着正確的方向或暗示的JavaScript或php的方法做字典從TXT文件,該文件會很棒。

+0

這是一個有趣的概念......你的目標是什麼? – Jason 2015-04-01 16:00:53

+0

'function Node(letter,definition,children)= {};' - >語法錯誤? – 2015-04-01 16:05:15

+0

@IsmaelMiguel對不起,沒有複製,沒有=標誌 和Jason:只是一些工作,試圖學習和了解更多的樹木和JS – 2015-04-01 16:31:04

回答

0

好吧......

所以這是包含txt文件的話

//words.txt 
hello 
world 
foo 
bar 

word_dictionary爲例.php用於解析txt文件,並具有檢查樹/字典中是否存在單詞的方法

<?php 
//word_dictionary.php 
class Node{ 
    private $letter; 
    private $definition = ''; 
    private $children = array(); 

    function __construct($letter){ 
     $this->letter = $letter; 
    } 

    function hasChild($letter){ 
     return array_key_exists($letter,$this->children); 
    } 

    function addChild($letter){ 
     $this->children[$letter] = new Node($letter); 
     return $this->children[$letter]; 
    } 

    function getChild($letter){ 
     return $this->children[$letter]; 
    } 

    function setDefinition($definition){ 
     $this->definition = $definition; 
    } 

    function getDefinition(){ 
     return $this->definition; 
    } 

    function hasDefinition(){ 
     return (bool)$this->definition; 
    } 
} 

// method for getting a word definition from tree/dictionary. 
// if word exists return definition, else return false 
function getDefinition($word,$tree){ 
    $node = $tree; 
    $length = strlen($word); 
    foreach(str_split($word) as $index => $letter){ 
     if($node->hasChild($letter)){ 
      $node = $node->getChild($letter); 
     } 
     else{ // word not exists 
      return false; 
     } 
     if(($index+1) == $length){  // means last letter in word 
      return ($node->hasDefinition()) ? $node->getDefinition() : false; 
     } 
    } 
} 

// Start build your tree/dictionary. This part is execute ONCE only for building tree. 
$anchor = new Node(''); 
$handle = fopen('words.txt','r'); 
while(($word = fgets($handle))){ 
    $word = rtrim($word); 
    $length = strlen($word); 
    $node = $anchor; 
    foreach(str_split($word) as $index => $letter){ 

     if($node->hasChild($letter)){ 
      $node = $node->getChild($letter); 
     } 
     else{ 
      $node = $node->addChild($letter); 
     } 

     if(($index+1) == $length){ 
      //print 'definition for word: '.$word."\n"; 
      $node->setDefinition('definition for world: '.$word); 
     } 
    } 
} 

//use this function when a user type a word that you want to check if exists and return the definition to user. this flow should be in AJAX request from client 
print getDefinition('bar',$anchor)."\n"; 

希望它有點幫助;)

+0

謝謝,你確實幫了我:) – 2015-04-01 22:28:08

0

首先,你問你是否正朝着正確的方向前進。好吧,我想你是。這可能不是今年的最佳實施,但你所說的所有事情都是相互一致的,而且看起來很穩固。

我不認爲給你一個直接的解決方案,你的問題將教學,因爲你正在與樹木工作,似乎你沒有太多的經驗與他們。

但我可以給你一些提示和參考。實現你的「最大功能:)」的一個非常方便的方法是使用一個遞歸函數,這個函數會在每個孩子身上調用它自己。我建議你看一下this wikipedia article。它顯示了樹看起來有點像你的例子,並實現一個完整的搜索算法,你可以適應你的需求沒有太多的問題。

希望的英語還不錯,而且它會幫助你

+0

好吧,謝謝,我打算看看那個方向:) – 2015-04-01 16:31:36