-1

我有这个数组数组:

数组 = [[“z1”、“y1”、“x1”]、[“z2”、“y2”、“x2”]、[“z3”、“y3”、“x3”]、[“z4”、 "y4" , "x4"]]

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

输出 = [["y1"], ["y2"], ["y3"], ["y4"]]

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

例子 :

output_x = [["x1"], ["x2"], ["x3"], ["x4"]]

output_y = [["y1"], ["y2"], ["y3"], ["y4"]]

output_z = [["z1"], ["z2"], ["z3"], ["z4"]]

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

结果 = [[“x1”、“y1”、“z1”]、[“x2”、“y2”、“z2”]、[“x3”、“y3”、“z3”]、[“x4”、 "y4" , "z4"]]

我真的很想为此找到解决方案。谢谢

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

4

3 回答 3

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]] }
于 2013-02-07T01:38:10.303 回答
2

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

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

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

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

有关排序的更多信息,请查看此处

更新

根据您在下面的评论,您在每个子数组中都有坐标。既然现在的订单是z, y, x,你要他们进来x, y, z。反转数组中的元素就可以了。

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

有关反向的更多信息,请查看此处

于 2013-02-07T01:28:24.920 回答
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
于 2013-02-07T01:40:34.253 回答