我试图找出一个Twitter句柄数组中有多少个元素包含一个数字,但我无法弄清楚。
我已经尝试过了:
users = ["@jcunniet","@PaulLampon","@Aziliz31","@ssoumier","@marionsouzeau","@gaellombart","@bendarag" ...]
n = [1, 2, 3, 4, 5, 6, 7, 8, 9, 0]
puts " #{users.sum { |s| s.count(n.to_s) }} handle contain a number"
答案 0 :(得分:3)
要计算满足某个条件的数组中有多少个元素,请将Array#count
与检查条件的块一起使用:
users = ["@jcunniet", "@PaulLampon", "@Aziliz31", "@ssoumier", "@marionsouzeau", "@gaellombart", "@bendarag"]
users.count {|user| user =~ /[0-9]/ }
# => 1
这比Array#grep
之类的方法更可取,因为它不会初始化中间数组。
答案 1 :(得分:0)
实际上,有一种非常简单的方法可以扫描列表并查看多少个字符串包含至少一个数字:
users = %w[ @jcunniet @PaulLampon @Aziliz31 @ssoumier @marionsouzeau @gaellombart @bendarag ]
users.grep(/\d/)
# => ["@Aziliz31"]
现在,如果您想知道计数的数量,则:
puts '%d handle contain a number' % users.grep(/\d/).length
/\d/
是正则表达式。这些可能会变得非常复杂,但这仅表示“数字”。正则表达式非常强大,因此不要被正则表达式吓倒,花一些时间来学习正则表达式的工作方式可能会导致真正紧凑的解决方案。
您的原始代码中有很多东西似乎是基于错误的假设。例如,查看n.to_s
的作用:
n= [1, 2, 3, 4, 5, 6, 7, 8, 9, 0]
n.to_s
# => "[1, 2, 3, 4, 5, 6, 7, 8, 9, 0]"
这是一个非常丑陋的字符串,count
将无法使用它,因为该字符串永远不会出现在Twitter句柄中。
与之类似,sum
希望添加内容,尽管这里似乎没有必要,因为没有要添加的内容。
Ruby有很多个工具可以帮助您。第一个挑战是将使用范围缩小到适当。下一步是扩展您的工具,使其包含更多sum
等奇特的工具。逐步进行操作,您会没事的。
答案 2 :(得分:0)
在Ruby中,您可以使用方法链使Enumerable#count返回Enumerable#grep找到的元素数。例如:
users.grep(/\d/).count
#=> 1
当然,还有其他方法可以执行此任务,但是此代码简短,简单且易于阅读。在这种情况下,链接方法似乎比将块传递给#count方法更具逻辑性和惯用性,但这全都取决于您真正尝试在代码中表达的语义。
不太漂亮,但包含Unicode支持:
users.grep(/\p{Nd}/).count
#=> 1
这与您提供的示例无关紧要,但是在实际代码中可能很重要,尤其是如果您的数组是动态构建的或包含经过清理的用户输入。