我有一個陣列,如
[
[358, 202102, 5] 。
[358, 202112, 5] 。
[358, 202102, 10] 。
[311, 202103, 5] 。
[311, 202101, 1] 。
[311, 202101, 1] 。
[311, 202115, 8] 。
[311, 202101, 1] 。
[311, 202101, 1] 。
]
我需要一個這樣的哈希值:
我需要一個這樣的哈希值。
{
358 => {
202102 => 15,
202112 => 5.
},
311 => {
202103 => 5,
202101 => 4,
202115 => 8.
}
}
順序并不重要。只有陣列中每一行的第三個值必須被加起來。
uj5u.com熱心網友回復:
你可以使用Enumberable#each_with_object解決這個問題,如下所示
a = [
[358, 202102, 5] 。
[358, 202112, 5] 。
[358, 202102, 10] 。
[311, 202103, 5] 。
[311, 202101, 1] 。
[311, 202101, 1] 。
[311, 202115, 8] 。
[311, 202101, 1] 。
[311, 202101, 1] 。
]
a.each_with_object(Hash.new {|h,k| h[k] = Hash.new(0)}) do |(k1,k2,val), obj|
obj[k1][k2] = val
結束。
# => {358=>{202102=>15, 202112=>5}, 311=>{202103=>5, 202101=>4, 202115=>8}}
這樣做的目的是用一個累加器物件(obj)對陣列(a)進行迭代。
這個物件是一個Hash,它有一個默認的程式,每次添加一個新的鍵,它的值都被分配為一個新的Hash,默認值為0。
在塊引數中,我們將陣列解構為3個引數(k1,k2,val),因此在第一遍時,它看起來像這樣:
k1 = 358。
k2=202102
val=5
obj[k1]
#=>{358=>{}}。
obj[k1][k2]
#=> {358 => {202102 => 0 }}
obj[k1][k2] = val
符號
#=> {358 => {202102 => 5 }}
uj5u.com熱心網友回復:
另一種方法是使用Hash#update(又名merge!)和Hash#merge,這些方法采用塊來確定被合并的兩個散列中存在的鍵的數值。關于這三個區塊變數的定義,請參見檔案。我在第一個區塊變數(被合并的哈希值的公共鍵)上使用了下劃線,以表示它不用于區塊計算。
a = [
[358, 202102, 5] 。
[358, 202112, 5] 。
[358, 202102, 10] 。
[311, 202103, 5] 。
[311, 202101, 1] 。
[311, 202101, 1] 。
[311, 202115, 8] 。
[311, 202101, 1] 。
[311, 202101, 1] 。
]
a.each_with_object({}) do |(x,y,n),h|
h.update(x=>{y=>n}) do |_,old1,new1|
old1.merge(new1) { |_,old2,new2| old2 new2 }
end
end
#=> {358=>{202102=>15, 202112=>5}, 311=>{202103=>5, 202101=>4, 202115=>8}}
uj5u.com熱心網友回復:
首先我創建一個默認值為0的哈希值。之后,我只是根據陣列中的最后一個值來增加哈希值。
aoa =
[
[358, 202102, 5] 。
[358, 202112, 5] 。
[358, 202102, 10] 。
[311, 202103, 5] 。
[311, 202101, 1] 。
[311, 202101, 1] 。
[311, 202115, 8] 。
[311, 202101, 1] 。
[311, 202101, 1] 。
]
hash = Hash.new { |h,k| h[k] = Hash.new(0) }
aoa.each { |ary| hash[ry[0]] [ry[1] ] = ary[2]] }
pp哈希
輸出:
{358=> {202102=> 15, 202112=>5}, 311=> {202103=>5, 202101=> 4, 202115=>8}}。
轉載請註明出處,本文鏈接:https://www.uj5u.com/qukuanlian/307032.html
標籤:
