我有一个形容词列表(找到here),我想成为“random_adjective(category)”方法的基础。
我真的只是对此进行了尝试,这是我第一次真正尝试一个有用的程序 第1步:打开文件,删除格式。没问题。
list=File.read('adjectivelist')
list.gsub(/\n/, " ")
下一步是按类别打破字符串..
list.split(" ")
现在我有一个文件中每个单词的数组。整齐。在它们之前带有波浪号的那些代表了类别名称。
现在我想根据类别将这个LARGE阵列拆分成几个较小的阵列。 我需要这里的语法帮助,虽然这个伪代码类似于
扫描数组以查找以波浪号开头的元素。 现在根据没有波浪号的元素的名称创建一个新数组,并将此“类别名称”放入“categories”数组中。现在从主数组中拉出所有元素,然后将它们弹出到子数组中,直到遇到另一个波形符。然后重复该过程,直到阵列中没有更多元素。
最后,我会从参数中指定的类别中提取一个随机单词。如果没有与参数匹配的类别名称,它将返回false并退出(这只是以防我以后想要添加更多类别。)
提示将不胜感激
答案 0 :(得分: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 :(得分:2)
使用slice_before
:
categories = list.split(" ").slice_before(/~\w+/)
这将为以~
开头的每个单词创建一个子数组,其中包含下一个匹配单词之前的所有单词。
答案 2 :(得分:1)
如果此文件格式是您的原始格式并且您可以自由更改它,那么我建议您将数据保存为yaml或json格式并在需要时阅读。有图书馆可以做到这一点。就这些。不用担心这个烂摊子。不要花时间重新发明轮子。