2013-03-21 83 views
3

我有一個形容詞列表(找到here),我想成爲「random_adjective(category)」方法的基礎。解析一個大陣列爲幾個子陣列

我真的只是在刺探這個,因爲我第一次真正嘗試一個有用的程序。
第1步:打開文件,刪除格式。沒問題。

list=File.read('adjectivelist') 
list.gsub(/\n/, " ") 

下一個步驟是按類別打破串起來..

list.split(" ") 

現在我已經在文件中每一個字的數組。整齊。在他們之前有一個代字號的代表類別名稱。

現在我想根據分類將這個大陣列拆分成幾個較小的陣列。 我需要這裏的語法幫助,儘管其僞代碼會是這樣的

掃描數組,它帶有一個波浪線開始的元素。 現在基於該元素的名稱創建一個新的數組sans the tilde,並且將這個「類別名稱」放入「categories」數組中。現在從主數組中拉出所有元素,並將它們彈出到子數組中,直到遇到另一個代字符。然後重複這個過程,直到數組中沒有更多的元素。

最後我會從參數中命名的類別中拉出一個隨機單詞。如果沒有分類名稱的參數匹配,它將返回false,並退出(這簡直是在情況下,我想在以後添加更多的類別。)

提示,將不勝感激

回答

2

使用slice_before

categories = list.split(" ").slice_before(/~\w+/) 

這將爲每個字開始~一個子陣列,包含所有字的下一個匹配的字之前。

3

你可能想回去第一次拆分像這樣:

categories = list.split(" ~") 

然後每個列表項都以類別名稱開頭。這將節省您不必回顧數據結構的建議。想想看,一個小竅門:有時,最好重新考慮編碼問題,而不是無情的頭向前

你達到對結構可能是一個哈希,其中的鍵是類別名稱的開始,和值是所有匹配形容詞的數組。這可能是這樣的:

{ 
    'category' => [ 'word1', 'word2', 'word3' ] 
} 

所以,你可以這樣做:

words_in_category = Hash.new 

categories.each do |category_string| 
    cat_name, *words = category_string.split(" ") 
    words_in_category[cat_name] = words 
end 

最後,從數組中選擇一個隨機元素,Ruby提供了一個非常有用的方法sample,這樣你就可以這樣做這

words_in_category[ chosen_category ].sample 

。 。 。假設chosen_category包含實際類別的字符串名稱。我會留給你找出如何把這一切,並處理錯誤,輸入錯誤等

1

如果這種文件格式是你的原創,你可以自由改變它,那麼我建議你保存數據爲yaml或json格式,並在需要時讀取它。有這樣的圖書館。就這些。不用擔心這個爛攤子。不要花時間重新發明輪子。