Arrays 如何识别最后一个字母y的索引?

Arrays 如何识别最后一个字母y的索引?,arrays,ruby,Arrays,Ruby,我需要创建一个方法来返回一个数组,该数组包含至少6个字符长且以y结尾的所有字符串。以y结尾让我很难受。我不知道该怎么做 我试过使用: if words.length >= 6 && words[-1] == "y" 但它似乎不起作用。 它只是返回一个空白。我不确定我做错了什么 a=["abcdey",'mckejy','jay','jjjjjjy','aaaaaa'] 代码 或 输出 ["abcdey", "mckejy"] 如果您想创建一个方法,那么 def fin

我需要创建一个方法来返回一个数组,该数组包含至少6个字符长且以y结尾的所有字符串。以y结尾让我很难受。我不知道该怎么做

我试过使用:

if words.length >= 6 && words[-1] == "y"
但它似乎不起作用。 它只是返回一个空白。我不确定我做错了什么

a=["abcdey",'mckejy','jay','jjjjjjy','aaaaaa']
代码

输出

["abcdey", "mckejy"]
如果您想创建一个方法,那么

def findTheString a
  a.filter {|x| x.length.eql? 6 and x[-1].downcase.eql? 'y'}
end

a=["abcdey", 'mckejy', 'jay', 'jjjjjjy', 'aaaaaa']

p findTheString a
正如Cary所建议的,下面是正则表达式解决方案

p a.filter{|x|x[/\A.{5}(y|Y)\z/]}

正如Cary Swoveland所建议的,下面是一个使用Regexp的解决方案,包括一个基准:

require "benchmark/ips"

RE_1 = /\A.{5,}y\z/i
RE_2 = /.{5}y\z/i
INPUT = ["abcdey", 'mckejy', 'jay', 'jjjjjjy', 'aaaaaa', 'aaaaaY', 'aaaaaaaY'].freeze

Benchmark.ips do |x|
  x.compare!
  x.report("select (downcase)") do
    INPUT.select{ |word| word.length >= 6 && word[-1].downcase == 'y' }
  end

  x.report("select (or)") do
    INPUT.select{ |word| word.length >= 6 && (word[-1] == 'y' || word[-1] == 'Y') }
  end

  x.report("re 1") do
    INPUT.select { |word| RE_1.match?(word) }
  end

  x.report("re 2") do
    INPUT.select { |word| RE_2.match?(word) }
  end
end


Comparison:
                re 2:   633881.7 i/s
                re 1:   615253.4 i/s - same-ish: difference falls within error
   select (downcase):   499513.6 i/s - 1.27x  slower
         select (or):   405617.5 i/s - 1.56x  slower

“它只是返回一个空白。”您能显示完整的方法以及如何调用它吗?我假设
单词
(复数)是您的字符串数组?如果是,代码将检查数组是否至少包含6个元素,以及最后一个元素是否为字符串
“y”
。那可能不是你想要的。尝试<代码>单词。选择{字符串>String。长度>=6 & & string = [ 1 ]=“y”}//>而不是满足条件的元素。作为替代,考虑使用正则表达式(用锚)。如果你写一个答案,那就太好了。我不擅长正则表达式。现在没有时间练习了。您希望匹配字符串的开头,后跟至少5个字符(任意字符),后跟一个
'y'
,后跟字符串的结尾,不区分大小写。再见。如果你想避免regexp,还有
x.end_with?(“y”,“y”)
。@steenslag是的,我已经忘记了这个函数,但无论如何我没有使用regex。我相信应该是
/\A.{5,}(y | y)\z/
{5}(y | y)\z/
,或者(最好的,imo)
INPUT.grep(/.{5}y\z/I)
@CarySwoveland显然你是对的。OP要求6个或更多字符长,而不仅仅是6个。已更新。还添加了Carry建议的Regexp。它似乎快了一点。但当然,这些微基准应该是有保留的。
p a.filter{|x|x[/\A.{5}(y|Y)\z/]}
require "benchmark/ips"

RE_1 = /\A.{5,}y\z/i
RE_2 = /.{5}y\z/i
INPUT = ["abcdey", 'mckejy', 'jay', 'jjjjjjy', 'aaaaaa', 'aaaaaY', 'aaaaaaaY'].freeze

Benchmark.ips do |x|
  x.compare!
  x.report("select (downcase)") do
    INPUT.select{ |word| word.length >= 6 && word[-1].downcase == 'y' }
  end

  x.report("select (or)") do
    INPUT.select{ |word| word.length >= 6 && (word[-1] == 'y' || word[-1] == 'Y') }
  end

  x.report("re 1") do
    INPUT.select { |word| RE_1.match?(word) }
  end

  x.report("re 2") do
    INPUT.select { |word| RE_2.match?(word) }
  end
end


Comparison:
                re 2:   633881.7 i/s
                re 1:   615253.4 i/s - same-ish: difference falls within error
   select (downcase):   499513.6 i/s - 1.27x  slower
         select (or):   405617.5 i/s - 1.56x  slower