【问题标题】:How to convert an String into Array in Ruby如何在Ruby中将字符串转换为数组
【发布时间】:2015-10-21 14:41:57
【问题描述】:

在 ruby​​ 中,我有一个带有字符串值的数组:

my_array=["210,207,203,199,169,165,159,152,148,144,140,137"]

如何将它转换成这样的普通数组:

my_array=[210,207,203,199,169,165,159,152,148,144,140,137]

注意:所有元素都是非负值。
我知道我可以通过手动修剪双引号来做到这一点,但我想知道是否有更优雅的方式来实现这一点?

【问题讨论】:

  • 我假设,如您的示例一样,您希望提取的整数始终为非负数,但应该说明这一点。另外,我不知道您所说的“手动修剪双引号”是什么意思。
  • DV 您的标题确实具有误导性。这是一个包含字符串的数组。并转换为整数数组
  • 您的标题确实具有误导性。这是一个包含字符串的数组。并转换为整数数组

标签: arrays ruby string


【解决方案1】:

我认为这应该可行:

my_array = my_array[0].split(',').map(&:to_i)

【讨论】:

  • 不需要轻描淡写。 :-)
【解决方案2】:

扩展 davidrac 的答案,您也可以使用 String#scan 而不是 String#split

my_array = my_array[0].scan(/\d+/).map(&:to_i)

编辑

这个明确的基准表明String#scan 更慢:

require 'benchmark'
string = "210,207,203,199,169,165,159,152,148,144,140,137"
Benchmark.bm do |x|
  x.report('split') { 1_000_000.times { string.split(',').map(&:to_i) } }
  x.report('scan') { 1_000_000.times { string.scan(/\d+/).map(&:to_i) } }
end

产量:

           user     system      total        real
split  3.550000   0.010000   3.560000 (  3.580334)
scan   7.350000   0.020000   7.370000 (  7.402508)

【讨论】:

  • 基准测试非常相似。跑了三遍。第一次分裂获胜,第二次平局,第三次扫描获胜。测试用例是来自 OP 示例的字符串。
  • Fe(又名@Iron),你断言的依据是什么?
  • @Cary 这是一个很小的区别,我敢肯定,但正则表达式可能是一个更重的机制。
  • @Iron,我曾经认为正则表达式操作通常很慢,但后来我看到了一些快如闪电的操作。最好在得出此类结论之前运行基准测试。
  • @Cary,我不会反对。
猜你喜欢
  • 2014-10-16
  • 1970-01-01
  • 2012-05-18
  • 1970-01-01
  • 2018-06-20
  • 1970-01-01
  • 1970-01-01
  • 2016-01-18
  • 2015-11-11
相关资源
最近更新 更多