将嵌套数组中的字符串值解析为整数

3

我有一个包含字符串值的嵌套数组:

a = [["2000", "2004"], ["2005", "2007"]]

我正在这样将值转换为整数:

我正在将值转换为整数:

int_val = []

a.each do |a|
  int_val << a.map(&:to_i)
end

int_val #=> [[2000, 2004], [2005, 2007]]

有没有一行代码的简短解决方案?[["2000", "2004"], ["2005", "2007"]].map(&:to_i)无法正常工作。

[["2000", "2004"], ["2005", "2007"]].map{|row| row.map(&:to_i)} 运行正常... - dawg
1
@dawg,你可能错过了halfelf之前提供的解决方案。 - Cary Swoveland
3
在代码中,如果重复使用外部变量名称(变量影子),可能会导致混淆。不要这样做。原句为:a.each do |a| - Stefan
4个回答

8
“二维地图”怎么样?
a = [["2000", "2004"], ["2005", "2007"]]
a.map {|i| i.map(&:to_i) }  # => [[2000, 2004], [2005, 2007]]

4

使用Enumerable#each_with_object方法:

a = [["2000", "2004"], ["2005", "2007"]]
a.each_with_object([]) do |a, int_val|
  int_val << a.map(&:to_i)
end
#⇒ [[2000, 2004], [2005, 2007]]

它应该比map.map消耗更少的内存。(感谢@pascalbetz指出这不是真的。)


2
为什么会使用更少的内存?@mudasobwa,你能详细解释一下吗? - Pascal
@pascalbetz 经过认真的重新思考,我不得不承认我错了。已更新答案。 - Aleksei Matiushkin
感谢更新。 实际上我并不是在“指出”,只是好奇为什么它可以使用更少的内存。仍然在想……可能会在某个时候编写一个基准测试。 - Pascal
@pascalbetz,这甚至稍微不太高效,因为与map不同,数组在添加新元素时必须被重新调整大小。 - Stefan

4
一个单独的map
a.map { |i, j| [i.to_i, j.to_i] }

当然,这并不是一个通用的解决方案,但对于您的例子非常好。

1

出于好奇:

a = [["2000", "2004"], ["2005", "2007"]]
a.flatten.map(&:to_i).each_slice(2).to_a
#⇒ [[2000, 2004], [2005, 2007]]

1
有趣的是,这个程序只有在 a.size == a[0].size == a[1].size == 2 时才能正常工作,但它却被评为了“绿色代码”。 - Cary Swoveland
的确,我也感到惊讶。 - Aleksei Matiushkin

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接