📌  相关文章
📜  如何按键或值对 Golang 地图进行排序?

📅  最后修改于: 2022-05-13 01:54:32.450000             🧑  作者: Mango

如何按键或值对 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 中按其键和值对地图进行排序。