Как идентифицировать индекс с последней буквой y? - PullRequest
0 голосов
/ 19 мая 2019

Мне нужно создать метод для возврата массива, содержащего все строки длиной не менее 6 символов и заканчивающиеся на y.Конец с у меня в тупик.Я не уверен, как это сделать.

Я пытался использовать:

if words.length >= 6 && words[-1] == "y"

, но, похоже, это не работает.Он просто возвращается с пробелом.Я не уверен, что я делаю неправильно.

Ответы [ 2 ]

1 голос
/ 19 мая 2019

Как предположил Кэри Свовеланд, вот решение с использованием 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
1 голос
/ 19 мая 2019
a=["abcdey",'mckejy','jay','jjjjjjy','aaaaaa']

код

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

или

p a.select{|x|x.length.eql?6 and x[-1].downcase.eql?'y'}

выход

["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

Как предположил Кэри, вот решение регулярного выражения

p a.filter{|x|x[/\A.{5}(y|Y)\z/]}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...