【问题标题】:Reorder Ruby array based on the first element of each nested array根据每个嵌套数组的第一个元素重新排序 Ruby 数组
【发布时间】:2012-03-05 09:56:39
【问题描述】:

我的目标是将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”将是一个合法的哈希键,所以最后一部分不起作用。感谢您的帮助。

【问题讨论】:

    标签: ruby arrays hash multidimensional-array


    【解决方案1】:

    你可以尝试做这样的事情:

    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 的值的新数组。另请参阅哈希#keys。

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

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

    Enumerable#flatten:

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

    【讨论】:

      猜你喜欢
      • 2018-07-16
      • 2019-10-23
      • 2012-02-29
      • 2012-03-29
      • 2020-02-21
      • 2021-03-11
      • 1970-01-01
      • 1970-01-01
      • 2013-04-30
      相关资源
      最近更新 更多