Biorąc pod uwagę ten blok kodu
map[string]int {"hello":10, "foo":20, "bar":20}
Chciałbym wydrukować
foo, 20
bar, 20
hello, 10
W kolejności od najwyższego do najniższego
Dzięki!
sorting
dictionary
go
samol
źródło
źródło
Less
zwracania złego wyniku. Do sortowania wstecznego użyj>
.sort.Reverse
. +1.Jest nowa funkcja sort.Slice w go 1.8, więc teraz jest to prostsze.
package main import ( "fmt" "sort" ) func main() { m := map[string]int{ "something": 10, "yo": 20, "blah": 20, } type kv struct { Key string Value int } var ss []kv for k, v := range m { ss = append(ss, kv{k, v}) } sort.Slice(ss, func(i, j int) bool { return ss[i].Value > ss[j].Value }) for _, kv := range ss { fmt.Printf("%s, %d\n", kv.Key, kv.Value) } }
https://play.golang.org/p/y1_WBENH4N
źródło
Na przykład:
package main import ( "fmt" "sort" ) func main() { m := map[string]int{"hello": 10, "foo": 20, "bar": 20} n := map[int][]string{} var a []int for k, v := range m { n[v] = append(n[v], k) } for k := range n { a = append(a, k) } sort.Sort(sort.Reverse(sort.IntSlice(a))) for _, k := range a { for _, s := range n[k] { fmt.Printf("%s, %d\n", s, k) } } }
Plac zabaw
Wynik:
foo, 20 bar, 20 hello, 10
źródło
Często muszę sortować
map[string]int
coś, co liczę i używam następujących.func rankMapStringInt(values map[string]int) []string { type kv struct { Key string Value int } var ss []kv for k, v := range values { ss = append(ss, kv{k, v}) } sort.Slice(ss, func(i, j int) bool { return ss[i].Value > ss[j].Value }) ranked := make([]string, len(values)) for i, kv := range ss { ranked[i] = kv.Key } return ranked }
Użyj go do iteracji po kluczach w kolejności według wartości
values := map[string]int{"foo": 10, "bar": 20, "baz": 1} for i, index := range rankMapStringInt(values) { fmt.Printf("%3d: %s -> %d", i, index, values[index]) }
źródło
W moim przypadku miałem do czynienia z programem, który stworzyłem. W tym programie stworzyłem Mapę taką jak Ty, używając
string
iint
. Potem odkryłem, tak jak ty, że Go tak naprawdę nie ma wbudowanego sposobu na uporządkowanie czegoś takiego. Przeczytałem inne odpowiedzi i nie podobało mi się to, co przeczytałem.Więc spróbowałem inaczej pomyśleć o problemie. Go może użyć sort.Ints z plasterkiem. Go może również używać sort.Slice z niestandardowym komparatorem. Więc zamiast tworzyć mapę
string
iint
, utworzyłemstruct
ofstring
iint
. Następnie możesz sortować:package main import ( "fmt" "sort" ) type File struct { Name string Size int } func main() { a := []File{{"april.txt", 9}, {"may.txt", 7}} f := func (n, n1 int) bool { return a[n].Size < a[n1].Size } sort.Slice(a, f) fmt.Println(a) }
To nie zadziała dla wszystkich, bo być może będziesz zmuszony zająć się mapą stworzoną przez kogoś innego. Ale to było dla mnie przydatne. Dobra część jest taka, że w przeciwieństwie do wszystkich innych odpowiedzi ta nie używa pętli.
źródło
Sortuj klucze najpierw według wartości, a następnie iteruj mapę:
package main import ( "fmt" "sort" ) func main() { counts := map[string]int{"hello": 10, "foo": 20, "bar": 20} keys := make([]string, 0, len(counts)) for key := range counts { keys = append(keys, key) } sort.Slice(keys, func(i, j int) bool { return counts[keys[i]] > counts[keys[j]] }) for _, key := range keys { fmt.Printf("%s, %d\n", key, counts[key]) } }
źródło