Ruby 将一个大数组解析为多个子数组

Ruby 将一个大数组解析为多个子数组,ruby,regex,arrays,file-io,syntax,Ruby,Regex,Arrays,File Io,Syntax,我有一个形容词列表(已找到),我想以此作为“random_形容词(category)”方法的基础 我只是想尝试一下,这是我第一次真正尝试一个有用的程序。 步骤1:打开文件,删除格式。没问题 list=File.read('adjectivelist') list.gsub(/\n/, " ") 下一步是按类别分解字符串 list.split(" ") 现在我有了文件中每个单词的数组。整洁的前面有波浪线的代表类别名称 现在,我想根据类别将这个大数组分成几个较小的数组。 我在这里需要语法方面的帮

我有一个形容词列表(已找到),我想以此作为“random_形容词(category)”方法的基础

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

list=File.read('adjectivelist')
list.gsub(/\n/, " ")
下一步是按类别分解字符串

list.split(" ")
现在我有了文件中每个单词的数组。整洁的前面有波浪线的代表类别名称

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

扫描阵列以查找以平铺开头的元素。 现在,基于无波浪线元素的名称创建一个新数组,并将此“类别名称”放入“类别”数组中。现在从主数组中提取所有元素,并将它们弹出到子数组中,直到遇到另一个瓷砖为止。然后重复该过程,直到数组中没有更多的元素

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


非常感谢您的提示

您可能希望第一次返回并像这样拆分:

categories = list.split(" ~")
{
  'category' => [ 'word1', 'word2', 'word3' ]
}
然后,每个列表项都将以类别名称开头。这将使您无需按照建议返回数据结构。考虑一个提示:有时候最好重新考虑一个编码问题的开始,而不是头向不可忽视的向前。 您要使用的结构可能是散列,其中键是类别名称,值是所有匹配形容词的数组。可能是这样的:

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

。假设
selected\u category
包含实际类别的字符串名称。我将留给您来解决如何将所有这些放在一起以及如何处理错误、错误输入等问题。如果此文件格式是您的原始格式,您可以自由更改,那么我建议您将数据保存为yaml或json格式,并在需要时读取。有一些库可以做到这一点。仅此而已。不用担心乱七八糟。不要花时间重新发明轮子。

使用:

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