【问题标题】:Ruby array map and join in one loopRuby数组映射并加入一个循环
【发布时间】:2013-10-01 14:20:09
【问题描述】:

数组示例

[
 [
   "Francis",
   "Chartrand",
   "email@email.com"
 ],
 [
   "Francis",
   "Chartrand",
   "second_email@email.com"
 ],...
]

想要的结果

"email@email.com, second_email@email.com, ..."

我的解决方案(两个循环)

array.map{|a| a[2]}.join(", ")

一个循环可以做到这一点吗?

【问题讨论】:

  • 我不会认为join 是一个循环。
  • @SergioTulentsev Ahah 不是为了作业,只是为了重构和个人信息
  • 对我来说更像是重构。 map/join 是常用的成语,不要误入歧途。
  • 好吧。当您查看运行时 (it is implemented using a O(n) loop) 时,您可以将 join 视为一个循环
  • 我相信 map/join 比带有条件检查的循环循环更好、更快。

标签: ruby arrays theory


【解决方案1】:

使用Enumerable#inject,我们可以在一个循环中完成任务:

a = [
  ["Francis", "Chartrand", "email@email.com"],
  ["Francis", "Chartrand", "second_email@email.com"]
]
a.inject(nil) {|str, arr| str ? (str << ', ' << arr[2]) : arr[2].dup}
#=> "email@email.com, second_email@email.com"

然而,这只是一个学术问题,因为无论如何map/join 更快且更具可读性。见this benchmark:

             user   system    total       real
map/join 1.440000 0.000000 1.440000 ( 1.441858)
inject   2.220000 0.000000 2.220000 ( 2.234554)

【讨论】:

  • 不错的答案,但映射和加入速度更快gist.github.com/chartrandf/6779594
  • @FrancisChartrand 当然,映射和连接不仅更快,而且更直接。这就是每个人都在告诉你的。但是由于您坚持不使用map和join,并且由于您坚持在一个循环中进行,并且由于您没有在问题中提及速度,所以这就是您得到的。
  • FrancisChartrand,你说得对。 map/join 更快(我创建了a second benchmark,我的答案针对性能进行了优化(所以它更公平一点))。我最好在我的回答中说明这一点:)
  • @tessi 注意你所做的优化改变了原始数组。执行后a[0]["Francis", "Chartrand", "email@email.com, second_email@email.com"]
  • @toro2k 不错。修复了它(这使代码看起来有点笨拙)。但无论如何我们都同意使用map/join,所以笨拙并不重要:)
【解决方案2】:

这是一种方法,但它可能不是特别快。

s = ''          
array.flatten.each_slice(3) {|e| s += e.last + ', '} 
s.chop.chop

这是另一个:

array.transpose[2].join(', ')

我假设您想要整个数组的单个电子邮件地址字符串。

【讨论】:

    猜你喜欢
    • 2019-12-11
    • 2021-03-03
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2023-01-19
    • 2013-03-21
    • 2015-08-24
    • 1970-01-01
    相关资源
    最近更新 更多