【Go】マップの値でソートされたキーを出力する

2023.09.15
2024.03.24
プログラミング
Go

はじめに

Go のマップを値でソートされた順でキーを出力したいと思います。

マップは基本的に要素の順番が意味を持たないときに使い、要素の順番に意味がある場合はスライスを使うのがいいですが、今回はマップの値でソートしてキーを出力する方法を紹介します。

マップを値でソートしてキーを出力

下記がサンプルになります。マップを表す構造体を定義して、その構造体に対して sort の Interface を作成し、ソートして出力しています。

1package main
2
3import (
4	"fmt"
5	"sort"
6)
7
8// マップ用の構造体
9type Pair struct {
10	Key   string
11	Value int
12}
13
14type PairList []Pair
15
16// ソート用のInterface
17func (p PairList) Len() int           { return len(p) }
18func (p PairList) Less(i, j int) bool { return p[i].Value < p[j].Value }
19func (p PairList) Swap(i, j int)      { p[i], p[j] = p[j], p[i] }
20
21func printKeyOrderByValue(targetMap map[string]int) {
22	pl := make(PairList, len(targetMap))
23	i := 0
24	for k, v := range targetMap {
25		pl[i] = Pair{k, v}
26		i++
27	}
28	sort.Sort(pl)
29
30  // 逆順
31	//sort.Sort(sort.Reverse(pl))
32
33	for _, v := range pl {
34		fmt.Printf("%s: %d\n", v.Key, v.Value)
35	}
36}
37
38func main() {
39	targetMap := map[string]int{
40		"five":  5,
41		"nine":  9,
42		"three": 3,
43		"four":  4,
44		"six":   6,
45		"two":   2,
46		"ten":   10,
47		"seven": 7,
48		"one":   1,
49		"eight": 8,
50	}
51
52	printKeyOrderByValue(targetMap)
53}

参考

Support

\ この記事が役に立ったと思ったら、サポートお願いします! /

buy me a coffee
Share

Profile

author

Masa

都内のIT企業で働くエンジニア
自分が学んだことをブログでわかりやすく発信していきながらスキルアップを目指していきます!

buy me a coffee