如何在Ruby 1.9.2中将一个级别数组拆分为多个数组

时间:2010-08-21 21:31:35

标签: ruby-on-rails ruby

我有一个这样的数组:

  

[234,235,343,445]

我想把它转换成这样的

  

[[234],[235],[343],[445]

ruby​​ 1.9.2中是否有核心库函数可以帮助我快速完成这项工作?如果不是有快速的方式?


我做了一些小测试

def test1
  array = []
  10000000.times do
    array << rand(1000000)
  end
  time = Time.now
  array.permutation(1).to_a
  puts "test1 (permutation) ---> Time = #{Time.now - time}"
end

def test2
  array = []
  10000000.times do
    array << rand(1000000)
  end
  time = Time.now
  array.zip()
  puts "test2 (zip)---> Time = #{Time.now - time}"
end

def test3
  array = []
  10000000.times do
    array << rand(1000000)
  end
  time = Time.now
  array.map { |a| [a] }
  puts "test3 (map) ---> Time = #{Time.now - time}"
end

test1 #test1 (permutation) ---> Time = 2.235128
test2 #test2 (zip)         ---> Time = 1.537088
test3 #test3 (map)         ---> Time = 2.230127

4 个答案:

答案 0 :(得分:5)

我不认为有一个核心功能可以做到这一点,但有一个快速的方法:

irb(main):001:0> [234, 235 , 343, 445].map { |a| [a] }
=> [[234], [235], [343], [445]]

答案 1 :(得分:4)

Array#zip(没有参数)也应该这样做,尽管map可能更直接:

telemachus $ irb
>> new = [234, 235 , 343, 445].zip() # The () is optional, .zip would work fine
=> [[234], [235], [343], [445]]

答案 2 :(得分:0)

在1.9.2中你可以这样做:

[234, 235 , 343, 445].permutation(1).to_a

答案 3 :(得分:0)

我认为你不会用这项任务快速完成任务。正如您的基准测试所示,zip是最快的方法(至少您测试过)。但是,这仍然需要创建大量的Array对象,而这只需要时间。如果你需要更快,也许你应该看看如何使用数据。没有更多相关信息,我要说的是:为什么它需要这种格式的数组?