ruby - 通过索引将数组数组的元素放在变量中

时间:2013-02-07 01:21:51

标签: ruby-on-rails ruby

我有这个数组数组:

  

array = [[“z1”,“y1”,“x1”],[“z2”,“y2”,“x2”],[“z3”,“y3”,“x3”],[“ z4“,”y4“,”x4“]]

我希望能够通过索引检索更大数组中的数组元素并将它们放在变量中 例如,对于索引 1 ,输出应为:

  

output = [[“y1”],[“y2”],[“y3”],[“y4”]]

之后我还希望能够将这些结果推送到新阵列。换句话说,我想重新排序数组的元素(如果你能找到比检索和推送更好的解决方案)。

示例:

  

output_x = [[“x1”],[“x2”],[“x3”],[“x4”]]

     

output_y = [[“y1”],[“y2”],[“y3”],[“y4”]]

     

output_z = [[“z1”],[“z2”],[“z3”],[“z4”]]

所以最终的结果应该是这样的:

  

result = [[“x1”,“y1”,“z1”],[“x2”,“y2”,“z2”],[“x3”,“y3”,“z3”],[“ x4“,”y4“,”z4“]]

我真的想找到一个解决方案。 谢谢

PS:x,y和z是坐标。忘记sort他们

3 个答案:

答案 0 :(得分:4)

您只需要Array#transpose,这是Array#zip的反转:

[["z1", "y1", "x1"],
 ["z2", "y2", "x2"],
 ["z3", "y3", "x3"],
 ["z4", "y4" , "x4"]].transpose

=> [["z1", "z2", "z3", "z4"],
    ["y1", "y2", "y3", "y4"],
    ["x1", "x2", "x3", "x4"]]

从那里,将它们分成单个数组就很容易了。如果您只想将数组转换为XYZ(而不是ZYX),那么您可能只想映射反转的数组:

[["z1", "y1", "x1"],
 ["z2", "y2", "x2"],
 ["z3", "y3", "x3"],
 ["z4", "y4" , "x4"]].map(&:reverse)
=> [["x1", "y1", "z1"],
    ["x2", "y2", "z2"],
    ["x3", "y3", "z3"],
    ["x4", "y4", "z4"]] 

您也可以只映射任意订单。例如,要从ZYX映射到XZY,您可以使用:

coordinates.map {|c| [c[2], c[0], c[1]] }

答案 1 :(得分:2)

您可以对array中的每个元素进行排序,就像这样

array.each do |e|
  e.sort!
end

如果你运行上面的代码,你的array看起来就像你想要的那样

result = [["x1", "y1", "z1"], ["x2", "y2", "z2"], ["x3", "y3", "z3"], ["x4", "y4" , "z4"]]

有关排序的详细信息,请查看here

<强>更新

根据您在下面的评论,您在每个子数组中都有坐标。由于现在订单为z, y, x,您希望它们位于x, y, z。反转数组中的元素就可以了。

array.each do |e|
  e.reverse!
end

有关反向的详细信息,请查看here

答案 2 :(得分:0)

如果您只是在寻找最终结果:

array  = [["z1", "y1", "x1"], ["z2", "y2", "x2"], ["z3", "y3", "x3"], ["z4", "y4" , "x4"]]
option = []

array.each do |item|
  option << item.reverse
end

puts option.inspect