Golang 如何按Map的键或值排序
假设我们有一个map,并且想要找到一个特定的键值对,但它可以位于任何顺序中,所以为了在Golang中拥有特定顺序的map,我们可以按其键或值对map进行排序。在本文中,我们将看到如何通过其键或值排序map中的map。
按键排序
要按值对map进行排序,我们需要首先创建该map的键列表(在Golang中为切片)。默认情况下,Golang使用排序的键打印map,但在遍历map时,它遵循按键出现的顺序。
因此,要在Golang中对map中的键进行排序,我们可以创建键的切片并对其进行排序,进而对切片进行排序。首先,我们将遍历map并将所有键附加到切片中。在我们拥有所有键之后,我们将使用 sort.String函数 对切片按字母顺序进行排序。这将给出map的键的排序后的切片/列表。在此之后,我们可以简单地迭代此切片并从map中的键访问值。
输出:
我们可以看到,通过排序map的键,我们能够遍历map。也可以按字母顺序按降序排列键,使用 Sort.Reverse函数 。
我们只需将 sort.Strings(keys) 更换为 sort.Sort(sort.Reverse(sort.StringSlice(keys))) ,以按字母顺序的降序获得切片。
输出:
因此,获取的键是原始map的相反顺序。您还可以使用sort模块中的各种函数进一步修改排序条件。
按值排序
我们甚至可以按排序值迭代map,为此我们需要使用sort.SliceStable函数。
首先,与按键排序方法相似,我们必须获得所有键的切片。现在我们想按值对键进行排序,为此,我们在sort模块中使用SliceStable函数。slicestable函数接受slice,我们可以提供less函数。我们可以简单地提供一个匿名/lambda函数,该函数检查提供的slice的值的比较。我们在map中比较第i个索引处的键,因此它变成map[slice [i]],这里的keys是map中所有键的切片,因此我们从map中访问每个键。因此,在此之后,我们应该根据这些键的值有一个按键排序的切片。
我们可以通过以下脚本测试输出。
输出:
在这里,我们可以看到切片中的键已按值的升序排序,如[mango、orange、apple、strawberry],它们的值分别为[3、5、7、9]。此外,我们必须遍历键切片并打印地图中的键和值。
输出:
因此,我们已按其值的升序遍历了地图。这里的键表示切片,所以我们通过 迭代器k 和索引元素的 空标识符 重新迭代它。因此,我们只需使用 k和map[k] 就可以访问键和值,此处的map是basket。
如果我们想按值的降序迭代地图,我们只需修改SliceStable less函数中的内容。
输出:
因此,通过将less函数返回值修改为大于操作符,我们能够按值的降序对地图进行排序。我们能够按升序/降序对键进行排序遍历地图。同样地,我们能够按键的值的升序和降序遍历地图。因此,我们能够在Golang中按键和值对地图进行排序。