如何根据一个子数组值在 ruby 中生成单独的数组数组
how to generate separate array of array in ruby based on one sub array value
我有如下数组:
a = [
["a", "v", 1], ["b", "w", 2], ["c", "x", 1], ["d", "y", 1],
["e", "z", 2], ["f", "one" , 3 ], ["g", "two" , 3 ], ["g", "one" , 4 ],
["f", "one" , 1 ], ["h", "one" , 5 ], ["f", "one" , 4 ],
# ...
]
然后,我希望结果为 5 个不同的数组
a1 = [ ["a", "v", 1],["c", "x", 1], ["d", "y", 1], ["f", "one" , 1 ] ]
a2 = [ ["b", "w", 2], ["e", "z", 2] ]
a3 = [ ["f", "one", 3], ["g", "two", 3] ]
a4 = [ ["g", "one", 4], ["f", "one", 4] ]
a5 = [ ["h", "one" , 5 ] ]
# ...
an = []
通过执行以下代码,我能够对其进行排序。
b = a.sort{|c,d|c[2] <=> d[2]}
如何生成这样的列表。
请提前help.Thanks
你可以使用 partition
:
a = [["a", "v", 1], ["b", "w", 2], ["c", "x", 1], ["d", "y", 1], ["e", "z", 2]]
a1, a2 = a.partition { |e| e[2] == 1 }
a1 #=> [["a", "v", 1], ["c", "x", 1], ["d", "y", 1]]
a2 #=> [["b", "w", 2], ["e", "z", 2]]
如果值超过 2 个,您可以使用 group_by
:
a = [
["a", "v", 1], ["b", "w", 2], ["c", "x", 1], ["d", "y", 1],
["e", "z", 2], ["f", "one" , 3 ], ["g", "two" , 3 ], ["g", "one" , 4 ],
["f", "one" , 1 ], ["h", "one" , 5 ], ["f", "one" , 4 ]
]
hash = a.group_by { |e| e[2] }
#=> { 1=>[["a", "v", 1], ["c", "x", 1], ["d", "y", 1], ["f", "one", 1]],
# 2=>[["b", "w", 2], ["e", "z", 2]],
# 3=>[["f", "one", 3], ["g", "two", 3]],
# 4=>[["g", "one", 4], ["f", "one", 4]],
# 5=>[["h", "one", 5]] }
要访问数组,您可以使用 hash[1]
、hash[2]
等,或者您可以将它们分配给变量:
a1, a2, a3, a4, a5 = hash.values_at(1, 2, 3, 4, 5)
a1 #=> [["a", "v", 1], ["c", "x", 1], ["d", "y", 1], ["f", "one", 1]]
a2 #=> [["b", "w", 2], ["e", "z", 2]]
a3 #=> [["f", "one", 3], ["g", "two", 3]]
a4 #=> [["g", "one", 4], ["f", "one", 4]]
a5 #=> [["h", "one", 5]]
Select 将是更具可读性的选项:
a.select do |v| v.third == 1 end
=> [["a", "v", 1], ["c", "x", 1], ["d", "y", 1]]
我有如下数组:
a = [
["a", "v", 1], ["b", "w", 2], ["c", "x", 1], ["d", "y", 1],
["e", "z", 2], ["f", "one" , 3 ], ["g", "two" , 3 ], ["g", "one" , 4 ],
["f", "one" , 1 ], ["h", "one" , 5 ], ["f", "one" , 4 ],
# ...
]
然后,我希望结果为 5 个不同的数组
a1 = [ ["a", "v", 1],["c", "x", 1], ["d", "y", 1], ["f", "one" , 1 ] ]
a2 = [ ["b", "w", 2], ["e", "z", 2] ]
a3 = [ ["f", "one", 3], ["g", "two", 3] ]
a4 = [ ["g", "one", 4], ["f", "one", 4] ]
a5 = [ ["h", "one" , 5 ] ]
# ...
an = []
通过执行以下代码,我能够对其进行排序。
b = a.sort{|c,d|c[2] <=> d[2]}
如何生成这样的列表。
请提前help.Thanks
你可以使用 partition
:
a = [["a", "v", 1], ["b", "w", 2], ["c", "x", 1], ["d", "y", 1], ["e", "z", 2]]
a1, a2 = a.partition { |e| e[2] == 1 }
a1 #=> [["a", "v", 1], ["c", "x", 1], ["d", "y", 1]]
a2 #=> [["b", "w", 2], ["e", "z", 2]]
如果值超过 2 个,您可以使用 group_by
:
a = [
["a", "v", 1], ["b", "w", 2], ["c", "x", 1], ["d", "y", 1],
["e", "z", 2], ["f", "one" , 3 ], ["g", "two" , 3 ], ["g", "one" , 4 ],
["f", "one" , 1 ], ["h", "one" , 5 ], ["f", "one" , 4 ]
]
hash = a.group_by { |e| e[2] }
#=> { 1=>[["a", "v", 1], ["c", "x", 1], ["d", "y", 1], ["f", "one", 1]],
# 2=>[["b", "w", 2], ["e", "z", 2]],
# 3=>[["f", "one", 3], ["g", "two", 3]],
# 4=>[["g", "one", 4], ["f", "one", 4]],
# 5=>[["h", "one", 5]] }
要访问数组,您可以使用 hash[1]
、hash[2]
等,或者您可以将它们分配给变量:
a1, a2, a3, a4, a5 = hash.values_at(1, 2, 3, 4, 5)
a1 #=> [["a", "v", 1], ["c", "x", 1], ["d", "y", 1], ["f", "one", 1]]
a2 #=> [["b", "w", 2], ["e", "z", 2]]
a3 #=> [["f", "one", 3], ["g", "two", 3]]
a4 #=> [["g", "one", 4], ["f", "one", 4]]
a5 #=> [["h", "one", 5]]
Select 将是更具可读性的选项:
a.select do |v| v.third == 1 end
=> [["a", "v", 1], ["c", "x", 1], ["d", "y", 1]]