2013-03-21 73 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格式,并在需要时读取它。有这样的图书馆。就这些。不用担心这个烂摊子。不要花时间重新发明轮子。