Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/ruby/20.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Arrays Ruby——通过键值在数组中添加子数组的值_Arrays_Ruby - Fatal编程技术网

Arrays Ruby——通过键值在数组中添加子数组的值

Arrays Ruby——通过键值在数组中添加子数组的值,arrays,ruby,Arrays,Ruby,所以我知道如何在数组中添加所有值 例如,[1,2,3,4]之和 [1,2,3,4].inject(&:+) #=> 10 但是,我有一个数组数组,并且希望添加具有每个子数组的相同第一个元素的值 # example [["A", 10],["A", 5],["B", 5],["B", 5],["C", 15], ["C", 15]] 期望输出: 任何帮助都将不胜感激 a = [["A", 10],["A", 5],["B", 5],["B", 5],["C", 15], ["C

所以我知道如何在数组中添加所有值

例如,[1,2,3,4]之和

[1,2,3,4].inject(&:+)
#=> 10 
但是,我有一个数组数组,并且希望添加具有每个子数组的相同第一个元素的值

# example
[["A", 10],["A", 5],["B", 5],["B", 5],["C", 15], ["C", 15]]
期望输出: 任何帮助都将不胜感激

a = [["A", 10],["A", 5],["B", 5],["B", 5],["C", 15], ["C", 15]]
result = a.group_by(&:first).each_with_object({}) do |(k, v), h|
  h[k] = v.map(&:last).inject(:+)
  # if your on Ruby 2.4+ you can write h[k] = v.sum(&:last)
end
#=> {"A"=>15, "B"=>10, "C"=>30}
另一种选择是从头构建哈希:

result = a.each_with_object({}) {|(k, v), h| h[k] = h[k].to_i + v }
#=> {"A"=>15, "B"=>10, "C"=>30}
如果您想要的输出是一个字符串
“(a:15)-(B:10)-(C:30)”

然后

您可以这样组合:

arr.each_with_object(Hash.new(0)) { |(f,g),h| h[f] += g }.
    map { |pair| "(%s : %s)" % pair }.join(" - ")
请参阅,特别是关于默认值的使用(此处为
0
)。

试试这个

arr = [["A", 10],["A", 5],["B", 5],["B", 5],["C", 15], ["C", 15]]

arr.group_by(&:first).map { |key, group| [key, group.map(&:last).inject(:+)] } 
# => [["A", 15], ["B", 10], ["C", 30]]
这是怎么回事

  • groupby(&:first)
    按第一个元素对子阵列进行分组
  • map{| key,group |…}
    转换组
  • group.map(&:last).inject(:+)
    汇总组中最后的所有元素

有更优雅的方法可以做到这一点,但这里是一个整体的解决方案,因此您可以理解逻辑

它的作用是:

  • 组合时,将数组转换为哈希 价值观
  • 然后它构建字符串,一次一个元素,存储 每个都在一个数组中
  • 最后,它将字符串数组合并到所需的输出中
  • "


    默认值
    0
    比我的解决方案更干净,检查是否存在密钥-像往常一样,很好!在2.4.0中,我们也可以这样使用
    sum
    :group.sum(&:last)。如果您是第一个例子,在2.4.0中,我们也可以使用
    h[k]=v.sum(&:last)
    @sagarpandya82是的,我知道有人会提出它:)编辑:)
    arr = [["A", 10],["A", 5],["B", 5],["B", 5],["C", 15], ["C", 15]]
    
    h = arr.each_with_object(Hash.new(0)) { |(f,g),h| h[f] += g }
      #=> {"A"=>15, "B"=>10, "C"=>30} 
    
    h.map { |pair| "(%s : %s)" % pair }.join(" - ")
      #=> "(A : 15) - (B : 10) - (C : 30)"
    
    arr.each_with_object(Hash.new(0)) { |(f,g),h| h[f] += g }.
        map { |pair| "(%s : %s)" % pair }.join(" - ")
    
    arr = [["A", 10],["A", 5],["B", 5],["B", 5],["C", 15], ["C", 15]]
    
    arr.group_by(&:first).map { |key, group| [key, group.map(&:last).inject(:+)] } 
    # => [["A", 15], ["B", 10], ["C", 30]]
    
    my_array = [["A", 10],["A", 5],["B", 5],["B", 5],["C", 15],["C", 15]]
    my_hash = {}
    output_array = []
    
    my_array.each do |item|
      my_hash[item[0]] ||= 0
      my_hash[item[0]] += item[1]
    end
    
    my_hash.each do |k,v|
      output_array.push("(#{k} : #{v})")
    end
    
    puts output_array.join(" - ")