Arrays 如何识别最后一个字母y的索引?
我需要创建一个方法来返回一个数组,该数组包含至少6个字符长且以y结尾的所有字符串。以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
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