在Golang中使用地图

问题描述 投票:-1回答:2

我是Go的新手并做了一些练习。其中之一是按频率对数组中的数字进行排序,从大多数到最不频繁。

Example: 
Input: [2, 2, 5, 7, 4, 4, 4, 7, 2]
Output: [2, 4, 7, 5]

请注意,[4, 2, 7, 5]也是正确的,因为4和2具有相同的频率。

为此我将数组转换为值值映射,这里看起来像这样:[2:3][4:3][7:2][5:1](2和3的频率为3,7的频率为2,...)

之后我想简单地遍历地图并输出按值排序的键。为此,我使用以下代码,这显然不起作用。为什么?

count := 0
max := -1

// break loop, if map is empty
for i := 0; i < 1; i-- {
    if len(m) == 0 {
        break
    }

    max = -1

    // get key of biggest value
    for k, v := range m {
        if v > max {
            max = k
        }
    }
    // res (for result) is a slice of integers
    res[count] = max
    // remove key-value-pair from map
    delete(m, max)
    count++
}
return res

请记住,这是一个练习。我非常肯定会有更好的方法来构建这样做。

sorting dictionary go
2个回答
1
投票

你的'max'变量用于跟踪到目前为止看到的最大频率。但是,当您执行'max = k'时,您将分配一个密钥。

您需要在单独的变量中跟踪与该频率相关的最大频率和密钥。

...
for k, v := range m {
    if v > maxFreq {
        maxFreq = v
        mostFrequentKey = k
    }
}
// res (for result) is a slice of integers
res[count] = mostFrequentKey
// remove key-value-pair from map
delete(m, mostFrequentKey)
count++
...

1
投票

对于已排序的频率,请使用地图,然后使用切片。例如,

package main

import (
    "fmt"
    "sort"
)

func main() {
    Input := []int{2, 2, 5, 7, 4, 4, 4, 7, 2}
    fmt.Println("Input:      ", Input)
    mFreq := make(map[int]int, len(Input))
    for _, n := range Input {
        mFreq[n]++
    }
    sFreq := make([][2]int, 0, len(mFreq))
    for n, f := range mFreq {
        sFreq = append(sFreq, [2]int{n, f})
    }
    sort.Slice(sFreq, func(i, j int) bool {
        if sFreq[i][1] <= sFreq[j][1] {
            if sFreq[i][1] < sFreq[j][1] {
                return false
            }
            if sFreq[i][0] >= sFreq[j][0] {
                return false
            }
        }
        return true
    },
    )
    Output := []int{2, 4, 7, 5}
    fmt.Println("Output:     ", Output)
    fmt.Println("Frequencies:", sFreq)
}

游乐场:https://play.golang.org/p/8tiSksz3S76

输出:

Input:       [2 2 5 7 4 4 4 7 2]
Output:      [2 4 7 5]
Frequencies: [[2 3] [4 3] [7 2] [5 1]]
© www.soinside.com 2019 - 2024. All rights reserved.