Goでmapにmapにmapを入れた集計


Goでmapにmapにmapを入れた集計をしてみます。

type SukinaKudamono struct {
    Count  int
    Prices map[int]int
}

kudamonoSyukei:= make(map[string]map[string]map[string]SukinaKudamono)

みたいな感じのやつです。
1つめのmapは果物、2つめは産地、3つめはブランドとします。

するとこんな感じの集計に加工できます。

// みんなが好きな果物
// 1. メロン 北海道 夕張メロン  12件
//     - 2000円 4件
//     - 1500円 8件
// 2. メロン 北海道 プリンスメロン 11件
//     - 1000円 11件
// 3. メロン 静岡  クラウンメロン 10件
//     - 5000円 2件
//     - 3000円 5件
//     - 2000円 3件

ハマりどころは、

var (
    kudamono = "メロン"
    sanchi   = "北海道"
    brand    = "夕張メロン"
)

if _, ok := kudamonoSyukei[kudamono]; !ok {
	kudamonoSyukei[kudamono] = map[string]map[string]SukinaKudamono{}
}
if _, ok := kudamonoSyukei[kudamono][sanchi]; !ok {
	kudamonoSyukei[kudamono][sanchi] = map[string]SukinaKudamono{}
}
if _, ok := kudamonoSyukei[kudamono][sanchi][brand]; !ok {
	kudamonoSyukei[kudamono][sanchi][brand] = SukinaKudamono{}
}

tmp := kudamonoSyukei[kudamono][sanchi][brand]
if tmp.Prices == nil {
	tmp.Prices = make(map[int]int)
}

いちいち初期化しないとダメなところですかね。

おしまい。


この記事が気に入ったらサポートをしてみませんか?