如何按键或值对 Golang 地图进行排序?
假设我们有一个映射,并且想要找到一个特定的键值对,但它可以以任何顺序定位,因此为了在 Golang 中按特定顺序排列映射,我们可以按其键或值对映射进行排序。在本文中,我们将了解如何在 go 语言中按其键或值对映射进行排序。
按键排序
要按值对映射进行排序,我们需要首先在该映射中创建一个键列表(Golang 中的切片)。默认情况下,Golang 使用排序的键打印地图,但在遍历地图时,它会按照键的顺序出现。
因此,要在 Golang 中对 map 中的键进行排序,我们可以创建一个键的切片并对其进行排序,然后对切片进行排序。首先,我们将遍历映射并将所有键附加到切片中。获得所有键后,我们将使用sort.String函数按字母顺序对切片进行排序。这将给出地图键的排序切片/列表。之后,我们可以简单地遍历这个切片并从映射中的键访问值。
Go
// Go program to sort the map by Keys
package main
import (
"fmt"
"sort"
)
func main() {
basket := map[string]int{"orange": 5, "apple": 7,
"mango": 3, "strawberry": 9}
keys := make([]string, 0, len(basket))
for k := range basket{
keys = append(keys, k)
}
sort.Strings(keys)
for _, k := range keys {
fmt.Println(k, basket[k])
}
}
Go
// Go program to sort the map by Keys
package main
import (
"fmt"
"sort"
)
func main() {
basket := map[string]int{"orange": 5, "apple": 7,
"mango": 3, "strawberry": 9}
keys := make([]string, 0, len(basket))
for k := range basket{
keys = append(keys, k)
}
sort.Sort(sort.Reverse(sort.StringSlice(keys)))
for _, k := range keys {
fmt.Println(k, basket[k])
}
}
Go
// Go program to sort the map by Values
package main
import (
"fmt"
"sort"
)
func main() {
basket := map[string]int{"orange": 5, "apple": 7,
"mango": 3, "strawberry": 9}
keys := make([]string, 0, len(basket))
for key := range basket {
keys = append(keys, key)
}
fmt.Println(basket)
fmt.Println(keys)
sort.SliceStable(keys, func(i, j int) bool{
return basket[keys[i]] < basket[keys[j]]
})
fmt.Println(keys)
}
Go
// Go program to sort the map by Values
package main
import (
"fmt"
"sort"
)
func main() {
basket := map[string]int{"orange": 5, "apple": 7,
"mango": 3, "strawberry": 9}
keys := make([]string, 0, len(basket))
for key := range basket {
keys = append(keys, key)
}
sort.SliceStable(keys, func(i, j int) bool{
return basket[keys[i]] < basket[keys[j]]
})
for _, k := range keys{
fmt.Println(k, basket[k])
}
}
Go
package main
import (
"fmt"
"sort"
)
func main() {
basket := map[string]int{"orange": 5, "apple": 7,
"mango": 3, "strawberry": 9}
keys := make([]string, 0, len(basket))
for key := range basket {
keys = append(keys, key)
}
sort.SliceStable(keys, func(i, j int) bool{
return basket[keys[i]] > basket[keys[j]]
})
for _, k := range keys{
fmt.Println(k, basket[k])
}
}
输出:
我们可以看到我们能够通过对地图的键进行排序来迭代地图。也可以使用Sort.Reverse函数对键进行降序排序。
我们只需将sort.Strings(keys ) 替换为 sort.Sort (sort.Reverse(sort.StringSlice(keys)))即可按字母降序获取切片。
去
// Go program to sort the map by Keys
package main
import (
"fmt"
"sort"
)
func main() {
basket := map[string]int{"orange": 5, "apple": 7,
"mango": 3, "strawberry": 9}
keys := make([]string, 0, len(basket))
for k := range basket{
keys = append(keys, k)
}
sort.Sort(sort.Reverse(sort.StringSlice(keys)))
for _, k := range keys {
fmt.Println(k, basket[k])
}
}
输出:
所以键是按照与原始映射相反的顺序获得的。您可以使用排序模块中的各种功能进一步修改排序标准。
按值排序
我们甚至可以通过对值进行排序来迭代地图,为此我们需要使用 sort.SliceStable函数。
首先,类似于按键排序的方法,我们必须获得所有键的切片。现在我们要根据值对键进行排序,为此,我们使用排序模块中的 SliceStable函数。 slicestable函数接受切片,我们可以提供更少的函数。我们可以简单地提供一个匿名/lambda 虚构来检查所提供切片的值的比较。我们比较映射中第 i 个索引处的键,使其变为 map[slice[i]],这里的键是映射中所有键的切片,因此我们从映射中访问每个键。因此,在此之后,我们应该根据这些键的值对键进行排序。
到目前为止,我们可以通过以下脚本测试输出。
去
// Go program to sort the map by Values
package main
import (
"fmt"
"sort"
)
func main() {
basket := map[string]int{"orange": 5, "apple": 7,
"mango": 3, "strawberry": 9}
keys := make([]string, 0, len(basket))
for key := range basket {
keys = append(keys, key)
}
fmt.Println(basket)
fmt.Println(keys)
sort.SliceStable(keys, func(i, j int) bool{
return basket[keys[i]] < basket[keys[j]]
})
fmt.Println(keys)
}
输出:
在这里,我们可以看到切片中的键已按值按升序排序,例如 [mango, orange, apple, strawberry],它们的值分别为 [3, 5, 7, 9]。此外,我们必须遍历键拼接并打印映射中的键和值。
去
// Go program to sort the map by Values
package main
import (
"fmt"
"sort"
)
func main() {
basket := map[string]int{"orange": 5, "apple": 7,
"mango": 3, "strawberry": 9}
keys := make([]string, 0, len(basket))
for key := range basket {
keys = append(keys, key)
}
sort.SliceStable(keys, func(i, j int) bool{
return basket[keys[i]] < basket[keys[j]]
})
for _, k := range keys{
fmt.Println(k, basket[k])
}
}
输出:
因此,我们按照其值的升序迭代了地图。这里的键代表拼接,所以通过迭代器 k和一个空白标识符作为元素的索引对其进行重复。因此,我们只需使用k访问键,并使用map[k]访问值,在这种情况下,地图就是篮子。
如果我们想通过按值的降序排序来迭代地图,我们只需要修改 SpliceStable 的 less函数中的内容。
去
package main
import (
"fmt"
"sort"
)
func main() {
basket := map[string]int{"orange": 5, "apple": 7,
"mango": 3, "strawberry": 9}
keys := make([]string, 0, len(basket))
for key := range basket {
keys = append(keys, key)
}
sort.SliceStable(keys, func(i, j int) bool{
return basket[keys[i]] > basket[keys[j]]
})
for _, k := range keys{
fmt.Println(k, basket[k])
}
}
输出:
因此,通过将 less函数的返回值更改为大于运算符,我们能够按降序对 map 进行排序。我们能够通过按升序/降序对键进行排序来迭代地图。类似地,我们可以通过按升序和降序对键的值进行排序来迭代地图。因此,我们能够在 Golang 中按其键和值对地图进行排序。