Ruby:严格地使用数组符号从字符串数组的每个元素中获取character [n]

时间:2019-03-13 20:27:16

标签: arrays ruby substring

假设我有这个

x = %w(greater yellow bandicooot)

我想获取每个字符串的特定字母作为字符串。当然,我可以做这样的事情(得到第一个字母):

x.map { |w| w[0] }.join  # => 'gyb'

但是我想知道是否有一种方法可以只使用数组表示法。我已经尝试过了:

x[0][0]..x[-1][0]

在这种情况下,哪个返回不太有用的"g".."b"。在这种情况下,我也可以这样使用数组符号:

x[0][0] + x[1][0] + x[2][0]

但是我正在寻找一种非特定案例的解决方案,不需要迭代。

是否存在一种使用数组符号严格执行此操作的方法,还是有必要进行某种迭代?而且,如果您不能使用数组符号来做到这一点,还有没有比使用mapjoin更好的方法了?

3 个答案:

答案 0 :(得分:3)

如果您将单词组合在单个以空格分隔的字符串中,那么这是一种花哨的正则表达式:

string = "greater yellow bandicooot"
string.gsub /([^ ])[^ ]* */, '\1'
# => "gyb"

正则表达式的解释:

  • ([^ ]):匹配组-单个非空格字符
  • [^ ]* *:非空格字符的可选序列,后跟空格字符的任何可选序列。

您可以在这里了解到:Ruby regex - gsub only captured group,当使用gsub时,整个正则表达式中的所有内容都将被替换,无论它是否在匹配组中。因此,您需要在\1调用中使用特殊变量gsub(顺便说一下,必须在单个引号中)引用第一个匹配组,并将其用作输出

答案 1 :(得分:2)

  

如果无法使用数组表示法,还有比使用map和join更好的方法了

好吧,简短的(错误的:)答案是“这是不可能的”-要使数组中每个字符串的每个n个字符显然都必须进行迭代(是的,regexp也是迭代的-最有可能是性能较低的)比数组迭代)。

但是让我们想象一下,您有一个真正的应用程序,您应该非常频繁地执行此操作,并且字符串列表很大(因此迭代很麻烦)。另一方面,字符串列表很少更改,您几乎再也不需要原始字符串了。

在这种情况下,您可以借用列存储背后的想法,并将原始数组转换为类似的

transposed_x = ["gyb", "rea", "eln", "ald", "toi", "ewc", "r_o", "__o", "__o", "__t"]

其中每个第n个元素只是每个原始字符串的第n个char的串联(为清楚起见,在此我用_替换“缺失”字符)。使用此数据模型,您可以在O(1)中仅使用数组符号执行原始任务1)和2)。作为一个明显的折衷,您将不得不对其他所有操作进行迭代(取回原始字符串,添加/删除/更新等)...

答案 2 :(得分:2)

我不认为有一种方法可以做您想要的事情,但是您可以执行以下操作。

str = %w(greater yellow bandicooot).join(' ')
  #=> "greater yellow bandicooot"

str.gsub(/(?<=\S)./, '')
  #=> "gyb"

正则表达式匹配任何以非空白字符开头的字符;也就是说,它匹配字符串的第一个字符和以空格字符开头的字符以外的所有字符。

如果给定一个字符串并且单词之间可能有多个空格,则可以写:

str.squeeze(' ').gsub(/(?<=\S)./, '')