gpt4 book ai didi

go - 如果无法在 Go 语言中对 map 进行排序,那么正确的做法是什么?

转载 作者:IT王子 更新时间:2023-10-29 01:39:52 27 4
gpt4 key购买 nike

假设我有一个字符串,我想计算每个字母的频率,然后按频率对表格进行排序。 “hello larry”的期望输出为:

+--------+-----------+
| Letter | Occurence |
+--------+-----------+
| l | 3 |
| r | 2 |
| h | 1 |
| e | 1 |
| o | 1 |
| a | 1 |
| y | 1 |
+--------+-----------+

首先我想我会使用以字母作为键的 map 轻松处理这个问题。这真的很容易。但是, map 项目不会have an order因此无法排序。

我想我可以使用一个结构来处理这个问题:

type Letter struct {
Value string
Score int
}
type LetterList []Letter

然而,这带来了一系列其他问题:

  1. 我需要检查 LetterList 中是否已经存在该 Letter,因为我不能将这些字母用作键
  2. 没有直接的方法对它们进行排序(使用 Int.sort() 左右)

使用这些结构一点也不优雅。有更好的解决方案吗?

最佳答案

您会惊讶于在一个小 slice 上循环的速度和效率是多么的快,而且您可以相当简单地在其上实现排序。

我推荐阅读 http://golang.org/pkg/sort/排序包装器。

type Letter struct {
Value rune
Score int
}

type LetterList []*Letter

func (ll *LetterList) FindOrAdd(r rune) (l *Letter) {
for _, l = range *ll {
if l.Value == r {
return
}
}
l = &Letter{Value: r, Score: 0}
*ll = append(*ll, l)
return
}

func (ll LetterList) SortByScore() LetterList {
sort.Sort(llByScore{ll})
return ll
}

func (ll LetterList) SortByValue() LetterList {
sort.Sort(llByValue{ll})
return ll
}

func (ll LetterList) String() string {
var b bytes.Buffer
b.WriteByte('[')
for _, v := range ll {
b.WriteString(fmt.Sprintf("{%q, %d}, ", v.Value, v.Score))
}
b.WriteByte(']')
return b.String()

}

func New(s string) (ll LetterList) {
ll = LetterList{}
for _, r := range s {
ll.FindOrAdd(r).Score++
}
return
}

func (ll LetterList) Len() int { return len(ll) }
func (ll LetterList) Swap(i, j int) { ll[i], ll[j] = ll[j], ll[i] }

type llByScore struct{ LetterList }

func (l llByScore) Less(i, j int) bool {
return l.LetterList[i].Score > l.LetterList[j].Score
}

type llByValue struct{ LetterList }

func (l llByValue) Less(i, j int) bool {
return l.LetterList[i].Value > l.LetterList[j].Value
}

func main() {
ll := New(`Let's say I have a string and I would like to count each letter's frequency and then sort the table by the frequency. Desired output of "hello larry" would be`)
fmt.Println(ll)
fmt.Println(ll.SortByScore())
fmt.Println(ll.SortByValue())
}

playground

另一种方法是使用 map 进行排序,然后从中生成一个列表并对其进行排序。

关于go - 如果无法在 Go 语言中对 map 进行排序,那么正确的做法是什么?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25350710/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com