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

时间:2013-03-21 23:37:50

标签: ruby regex arrays file-io syntax

我有一个形容词列表(找到here),我想成为“random_adjective(category)”方法的基础。

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

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

下一步是按类别打破字符串..

list.split(" ")

现在我有一个文件中每个单词的数组。整齐。在它们之前带有波浪号的那些代表了类别名称。

现在我想根据类别将这个LARGE阵列拆分成几个较小的阵列。 我需要这里的语法帮助,虽然这个伪代码类似于

  

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

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

提示将不胜感激

3 个答案:

答案 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格式并在需要时阅读。有图书馆可以做到这一点。就这些。不用担心这个烂摊子。不要花时间重新发明轮子。