使用唯一的分隔符添加数组的最后一个索引

时间:2017-08-22 23:37:12

标签: arrays ruby join flatten

我试图让数组的最后一个字符加入它自己的角色。我无法自己解决这个问题,我仍然不熟悉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"

3 个答案:

答案 0 :(得分:1)

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

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

享受!

答案 1 :(得分:1)

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

<强>代码

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"

正则表达式采用正向前瞻,读取“匹配逗号,后跟逗号以外的一个或多个字符,后跟字符串的结尾”。

答案 2 :(得分:0)

以下是牛津逗号的解决方案,我更喜欢:)

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会自动执行此操作。)