按键排列golang映射值
在主题函数返回的代码中迭代返回的映射时,键不会按顺序显示。
我怎样才能得到钥匙按顺序sorting映射,以便按键顺序和值对应?
这是代码 。
Go博客:Go的行动有一个很好的解释。
当使用范围循环迭代映射时,迭代次序没有被指定,并且不能保证从一次迭代到下一次迭代是相同的。 自Go 1开始,运行时随机化映射迭代顺序,因为程序员依赖于前一个实现的稳定迭代顺序。 如果您需要稳定的迭代顺序,则必须维护一个单独的数据结构来指定该顺序。
这里是我修改版本的示例代码: http : //play.golang.org/p/dvqcGPYy3-
package main import ( "fmt" "sort" ) func main() { // To create a map as input m := make(map[int]string) m[1] = "a" m[2] = "c" m[0] = "b" // To store the keys in slice in sorted order var keys []int for k := range m { keys = append(keys, k) } sort.Ints(keys) // To perform the opertion you want for _, k := range keys { fmt.Println("Key:", k, "Value:", m[k]) } }
输出:
Key: 0 Value: b Key: 1 Value: a Key: 2 Value: c
根据Go规范 ,在地图上迭代的顺序是不确定的,并且在程序运行之间可能会有所不同。 实际上,它不仅是不确定的,而且实际上是有意随机的。 这是因为它曾经是可预测的,Go语言开发人员不希望人们依赖不确定的行为,所以他们故意将其随机化,以便依靠这种行为是不可能的。
然后,你需要做的就是将键盘拉到一个切片上,然后sorting,然后像这样排列在切片上:
var m map[keyType]valueType keys := sliceOfKeys(m) // you'll have to implement this for _, k := range keys { v := m[k] // k is the key and v is the value; do your computation here }
这是我的方法:
-
首先我们从原始地图创build一个新的倒转地图,这意味着在新创build的地图中键值对将被倒置:
//Inverting maps invMap := make(map[int]string, len(values)) for k,v := range values { invMap[v] = k }
-
那么我们定义另一个只包含可以用exsorting的键的映射。 bubblesortsortingalgorithm。
//Bubblesort func BubbleSort(arr[] int)[]int { for i:=1; i< len(arr); i++ { for j:=0; j < len(arr)-i; j++ { if (arr[j] > arr[j+1]) { arr[j], arr[j+1] = arr[j+1], arr[j] } } } return arr }
这是最后的工作代码:
package main import ( "fmt" ) var ( values = map[string]int{ "alpha": 34, "bravo": 56, "charlie": 23, "delta": 87, "echo": 56, "foxtrot": 12, "golf": 34, "hotel": 16, "indio": 87, "juliet": 65, "kilo": 43, "lima": 98} ) func main() { //Inverting maps invMap := make(map[int]string, len(values)) for k,v := range values { invMap[v] = k } //Sorting sortedKeys := make([]int, len(invMap)) var i int = 0 for k := range invMap { sortedKeys[i] = k i++ } fmt.Println("Sorted keys") bubbleSorted := BubbleSort(sortedKeys) fmt.Println(bubbleSorted) fmt.Println("Inverted map...") for _,k := range bubbleSorted { fmt.Printf("Key: %v, Value : %v\n", k, invMap[k]) } } //Bubblesort func BubbleSort(arr[] int)[]int { for i:=1; i< len(arr); i++ { for j:=0; j < len(arr)-i; j++ { if (arr[j] > arr[j+1]) { arr[j], arr[j+1] = arr[j+1], arr[j] } } } return arr }