我的目标是将a转换为b:
a = [["a","b"], ["d", "c"], ["a", "o"], ["d", "g"], ["c", "a"]]
b = [[["a","b"], ["a", "o"]], ["c", "a"], [["d", "c"], ["d", "g"]]
它们按每个嵌套数组中的第一个元素分组。到目前为止,我有:
def letter_frequency(c)
d = Hash.new(0)
c.each do |v|
d[v] += 1
end
d.each do |k, v|
end
end
def separate_arrays(arry)
arry2 = []
arry3 = []
big_arry = []
y = 0
while y < arry.length
arry2.push(arry[y][0])
arry3.push(arry[y][1])
y += 1
end
freq = letter_frequency(arry2)
front = arry.slice!(0..(freq["a"] - 1))
end
separate_arrays(a)
这不仅看起来有点矫枉过正,而且现在保证“a”将成为合法的Hash密钥,因此最后一部分不起作用。谢谢你的帮助。
答案 0 :(得分:3)
您可以尝试这样做:
a.group_by(&:first).values.map {|e| e.length > 1 ? e : e.flatten}
# => [[["a", "b"], ["a", "o"]], [["d", "c"], ["d", "g"]], ["c", "a"]]
我使用以下方法:
Enumerable#group_by(通过数组的第一个元素,就像你的问题一样):
返回一个哈希,这些键是从块中得到的结果,以及 values是枚举中与键对应的元素数组。
返回一个填充了hsh值的新数组。另见Hash#keys。
Enumerable#map(必需,因为当只有一个匹配时,您不希望获得嵌套数组,例如c
字母):
为枚举中的每个元素返回一个新数组,其中包含一次运行块的结果。
返回一个新数组,该数组是此数组的一维展平 (递归)。也就是说,对于作为数组的每个元素,都要提取 它的元素进入新数组。如果是可选的level参数 确定要展平的递归级别