将Ruby数组字符串转换为整数数组

时间:2018-03-22 18:05:04

标签: arrays ruby string integer

我有一个id号的数组(技术上是一个字符串)。

ids = "[1, 2, 3, 4, 5, 6, 7, 8, 9, 10]"

我想将id组成一个如下所示的数组:

ids = [1, 2, 3, 4, 5, 6, 7, 8, 9, 10]

我发现这样做的唯一方法就是使用地图。

id_numbers = ids.split(/,\s?/).map(&:to_i)

但是,这会丢弃数组中的第一个数字,并将其替换为0。

id_numbers = [0, 2, 3, 4, 5, 6, 7, 8, 9, 10]

有没有更好的方法将字符串数组转换为常规数组?

3 个答案:

答案 0 :(得分:5)

由于这实际上是JSON格式,答案很简单:

require 'json'

id_json = "[1, 2, 3, 4, 5, 6, 7, 8, 9, 10]"

ids = JSON.load(id_json)

你的解决方案" lops off"第一个数字是因为你分裂的方式。第一个"数字"在你的系列中实际上是"[1",而Ruby不是一个数字,所以它默认转换为0。

答案 1 :(得分:3)

如果您不想使用JSON

ids.scan(/\d+/).map(&:to_i)
  #=> [1, 2, 3, 4, 5, 6, 7, 8, 9, 10]

如果ids可能包含负整数的字符串表示形式,请将正则表达式更改为/-?\d+/

答案 2 :(得分:0)

总结一下:由于字符串开头的非数字字符,你得到0作为数组中的第一个元素:

p '[1'.to_i         #=> 0

也许有更好的方式来接收原始字符串。如果没有其他方式来接收该字符串,您可以简单地摆脱第一个字符,并且您自己的解决方案将起作用:

ids = "[1, 2, 3, 4, 5, 6, 7, 8, 9, 10, -11]"

p ids[1..-1].split(",").map(&:to_i)
# [1, 2, 3, 4, 5, 6, 7, 8, 9, 10, -11]

@tadman&{39}和@CarySwoveland的解决方案完美无缺。可替换地:

ids = "[1, 2, 3, 4, 5, 6, 7, 8, 9, 10, -11]"

p ids.tr("^-0-9", ' ').split.map(&:to_i)
# [1, 2, 3, 4, 5, 6, 7, 8, 9, 10, -11]

请记住&:首次出现在Ruby 1.8.7中。