3

我有一个形容词列表(在此处找到),我想将其作为“random_adjective(category)”方法的基础。

我真的只是在尝试一下,作为我第一次真正尝试一个有用的程序。
第1步:打开文件,删除格式。没问题。

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

下一步是按类别分解字符串。

list.split(" ")

现在我有了文件中每个单词的数组。整洁的。前面带波浪号的代表类别名称。

现在我想根据类别将这个 LARGE 数组分成几个较小的数组。 我需要这里的语法帮助,尽管它的伪代码类似于

扫描数组以查找以波浪号开头的元素。现在根据该元素的名称创建一个新数组,不带波浪号,并将此“类别名称”放入“类别”数组中。现在从主数组中拉出所有元素,并将它们弹出到子数组中,直到遇到另一个波浪号。然后重复这个过程,直到数组中没有更多元素。

最后,我会从参数中命名的类别中随机抽取一个词。如果没有与参数匹配的类别名称,它将返回 false 并退出(这只是为了以防我以后想添加更多类别。)

提示将不胜感激

4

3 回答 3

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包含实际类别的字符串名称。我会留给你弄清楚如何将这些放在一起并处理错误、错误输入等

于 2013-03-21T23:51:58.953 回答
2

使用slice_before

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

这将为每个以 开头的单词创建一个子数组~,其中包含下一个匹配单词之前的所有单词。

于 2013-03-21T23:55:54.740 回答
1

如果此文件格式是您的原始文件并且您可以自由更改它,那么我建议您将数据保存为 yaml 或 json 格式并在需要时读取。有图书馆可以做到这一点。就这些。不用担心混乱。不要花时间重新发明轮子。

于 2013-03-21T23:54:18.417 回答