Ruby 2维数组基于第一项拒绝

时间:2017-06-25 21:40:23

标签: arrays ruby

我有一个二维数组

array = [["a first sentence of 6 words","Reference 1"],["another sentence that may be longer with 9 words","Reference 2"]]

我想删除第一个元素包含少于7个字的所有条目,因此请获取以下数组

[["another sentence that may be longer with 9 words","Reference 2"]]

我尝试过各种各样的事情,包括

   array.reject { |a| a.first.split.size < 7 }

但是我收到了错误

undefined method `split' for 0:Fixnum

我也试过

   array.reject { |a| a[0].split.size < 7 }

   array.reject { |a| a.first.size < 7 }

但它似乎创建了一个无限循环,页面继续加载没有结果。任何人都可以帮助我获得正确的语法吗?

2 个答案:

答案 0 :(得分:0)

看起来数组中的第一个元素之一是Fixnum。在Fixnum上没有定义split,因此出错。

如果第一项的to_s.split小于7,则拒绝。

array.reject { |a| a.first.to_s.split.size < 7 }

答案 1 :(得分:0)

您可以通过计算空格而不是创建中间人Array来提高效率。您还可以使用并行分配使其更具可读性。 e.g。

 arr = [
        ["a first sentence of 6 words","Reference 1"],
        ["another sentence that may be longer with 9 words","Reference 2"]
       ]
# split with no argument will separate on space and create an Array
# this means we can use `String#count` and look for the number of spaces that would 
# create 7 words (e.g. 6 spaces) 
# `#strip` will get rid of leading an trailing spaces so that `#count` will work like `#split`
arr.reject {|sentence,_ref| sentence.to_s.strip.count(' ') < 6 }