根据每个嵌套数组的第一个元素重新排序Ruby数组

时间:2012-03-05 09:56:39

标签: ruby arrays hash multidimensional-array

我的目标是将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密钥,因此最后一部分不起作用。谢谢你的帮助。

1 个答案:

答案 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是枚举中与键对应的元素数组。

Hash#values

  

返回一个填充了hsh值的新数组。另见Hash#keys。

Enumerable#map(必需,因为当只有一个匹配时,您不希望获得嵌套数组,例如c字母):

  

为枚举中的每个元素返回一个新数组,其中包含一次运行块的结果。

Enumerable#flatten

  

返回一个新数组,该数组是此数组的一维展平   (递归)。也就是说,对于作为数组的每个元素,都要提取   它的元素进入新数组。如果是可选的level参数   确定要展平的递归级别