【问题标题】:Array of arrays with vowels/consonants as elements以元音/辅音为元素的数组数组
【发布时间】:2018-07-26 18:37:21
【问题描述】:

我刚开始使用 Ruby。我需要构建一个将两个字母作为参数的方法,并返回一个由两个数组组成的数组,该数组包含相同的两个字母以及它们之间包含的字母。第一个数组应该只包含元音,而第二个数组只包含辅音。例如:

def alphamek('a', 'd') 

应该返回:

[['a'], ['b', 'c', 'd']]

我试过了:

def alphamek(letter1, letter2) 
first_array = (letter1..letter2).scan[aeiou].to_a
second_array = (letter1..letter2).scan[^aeiou].to_a
multi_array = [[first_array], [second_array]]
end

但它似乎不起作用。有什么想法吗?

【问题讨论】:

  • 这可能是您的拼写错误,但letter1letter2 不应是字符串文字,即删除'
  • 已更正,谢谢。

标签: arrays ruby methods


【解决方案1】:

您在(letter1..letter2) 范围内调用scan。该方法不存在。 您可以调用select,因为范围是可枚举的,请参阅有关select 解释的文档:http://ruby-doc.org/core-2.5.0/Enumerable.html#method-i-select

这是一个与您的方法非常相似的可行替代方案(如您所愿):

def alphamek(letter1, letter2)
  vowels = 'aeiou'
  # select all letters that are vowels
  first_array = (letter1..letter2).select { |letter| vowels.include?(letter) }
  # reject all letters that are vowels
  second_array = (letter1..letter2).reject { |letter| vowels.include?(letter) }
  return first_array, second_array # => [[...], [...]]
end

reject 与 select 正好相反,我更喜欢使用它而不是反转条件。

无论如何,这种分区有更好的方法:

def alphamek(letter1, letter2)
  vowels = 'aeiou'
  (letter1..letter2).partition { |letter| vowels.include?(letter) }
end

这与其他方法相同。 partition 将 enumerable 拆分为两个数组,第一个包含块评估为 true 的值,第二个包含它评估为 false 的值。 请参阅文档中的partitionhttp://ruby-doc.org/core-2.5.0/Enumerable.html#method-i-partition

【讨论】:

  • vowels = 'aeiou' 怎么样?
  • 更好!感谢您的提示。
【解决方案2】:

另一种方法是使用方法Array#&Array#-

VOWELS = %w| a e i o u |
  #=> [“a“, ”e”, ”i”, ”o”, ”u”]

def doit(first_letter, last_letter)
  letters = (first_letter..last_letter).to_a
  [VOWELS & letters, letters - VOWELS]
end

doit 'f', 't'
  #=> [["i", "o"], ["f", "g", "h", "j", "k", "l", "m", "n", "p", "q", "r", "s", "t"]]
doit 'f', 'o'
  #=> [["i", "o"], ["f", "g", "h", "j", "k", "l", "m", "n"]]
doit 'v', 'z'
  #=> [[], ["v", "w", "x", "y", "z"]]

【讨论】:

  • 之所以称为数组差异是因为[1, 1, 2, 2] - [1]返回[2, 2]而不是[2]
  • 感谢@Stefan 直言不讳。我应该注意到,考虑到我对方法 Array#difference 的喜爱。
【解决方案3】:

如果您从正则表达式的角度工作并利用像partition 这样的工具,那并不是那么难:

VOWEL = /[aeiou]/i

def alphamek(a, b)
  (a..b).partition { |l| VOWEL.match(l) }
end

【讨论】:

    猜你喜欢
    • 2021-08-07
    • 2020-04-02
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多