【问题标题】:Add the last index of an array with a unique seperator添加具有唯一分隔符的数组的最后一个索引
【发布时间】:2018-01-31 09:06:19
【问题描述】:

我试图让数组的最后一个字符加入它自己的字符。我在尝试自己解决这个问题时遇到了麻烦我仍然不熟悉 ruby​​ 上的内置方法。这是我目前所处的位置:

def list(names)
#last = names.last
joined = names.map(&:values).flatten.join(", ")
#joined.pop
#joined << last.join(" &")
end

我想要做的是最后一个索引,我想用它自己的字符加入它。我已经尝试这样做了几个小时,但我不断收到错误。如果有人能指出我正确的方向,我将不胜感激。

我的输出目标是

list([{name: 'Bart'},{name: 'Lisa'},{name: 'Garry'}])

输出:

"Bart, Lisa & Gary"

【问题讨论】:

  • 您能否添加一个输入和预期输出的示例?
  • 我只是对混乱感到抱歉。

标签: arrays ruby join flatten


【解决方案1】:

这是一个牛津逗号的解决方案,我更喜欢:)

def list(name_list)
  *names, last = name_list.flat_map(&:values)
  oxford_comma = names.size > 1 ? ", " : ""
  names.join(", ") + oxford_comma + "& #{last}"
end

(注意:如果这是 Rails,Array#to_sentence 会自动执行此操作。)

【讨论】:

  • 你可以用 flat_map 替换 map + flatten
  • 我添加了flat_map。关于牛津逗号的好点。我认为它实际上不会被 OP 使用:)
【解决方案2】:

根据您的输入,这是一个产生所需输出的解决方案:

def list(names)
    *head, tail = names.map(&:values)
    [head.join(", "), tail].join(" & ")
end

享受吧!

【讨论】:

  • 请注意,您可以使用map 而不是flat_map,因为Array#join 是递归应用的。
  • @CarySwoveland 感谢您的提示!我已经编辑了我的答案以反映您的反馈。我想我应该更仔细地阅读文档。干杯!
【解决方案3】:

我建议创建所有名称用逗号分隔的字符串(例如,“Bart, Lisa, Garry”),然后用“&”替换最后一个逗号。这里有两种方法可以做到这一点。

代码

def list1(names)
  all_commas(names).tap { |s| s[s.rindex(',')] = ' &' }
end

def list2(names)
  all_commas(names).sub(/,(?=[^,]+\z)/, ' &')
end

def all_commas(names)
  names.map(&:values).join(', ')
end

示例

names = [{ name: 'Bart' }, { name: 'Lisa' } , { name: 'Garry' }]

list1 names
  #=> "Bart, Lisa & Garry"

list2 names
  #=> "Bart, Lisa & Garry"

说明

步骤如下。

对于all_commas

a = names.map(&:values)
  #=> [["Bart"], ["Lisa"], ["Garry"]]
a.join(', ')
  #=> "Bart, Lisa, Garry"

对于list1

s = all_commas(names)
  #=> "Bart, Lisa, Garry"
i = s.rindex(',')
  #=> 10
s[i] = ' &'
  #=> " &"
s #=> "Bart, Lisa & Garry"

tap的块返回s

对于list2

a = all_commas(names)
  #=> "Bart, Lisa, Garry"
a.sub(/,(?=[^,]+\z)/, ' &')
  # => "Bart, Lisa & Garry"

使用正向预测的正则表达式读取为“匹配一个逗号,后跟一个或多个逗号以外的字符,然后是字符串的结尾”。

【讨论】:

    猜你喜欢
    • 2023-04-01
    • 1970-01-01
    • 1970-01-01
    • 2021-12-27
    • 2012-12-21
    • 1970-01-01
    • 2010-11-06
    • 1970-01-01
    • 2013-09-14
    相关资源
    最近更新 更多