按照每个嵌套数组的第一个元素重新排列Ruby数组

3

我的目标是将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”是一个合法的哈希键,因此最后一部分不起作用。谢谢您的任何帮助。
1个回答

4
您可以尝试像这样做:

您可以尝试像这样做:

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(按数组的第一个元素分组,就像您的问题一样):
返回一个哈希表,其中键是从块中计算得出的结果,值是对应于键的枚举中的元素数组。
- Hash#values
返回一个新的数组,其中包含从hsh中获取的值。另请参见Hash#keys。
- Enumerable#map(必需,因为当只有一个匹配项时,您不想得到嵌套的数组,例如c字母):
返回一个新的数组,其中包含对枚举中的每个元素运行块一次的结果。
- Enumerable#flatten
返回一个新的数组,该数组是此数组的一维展开(递归)。也就是说,对于每个作为数组的元素,将其元素提取到新数组中。如果可选的level参数确定要展平的递归级别。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接