Go语言如何实现字符串非空白字符计数并按频次排序输出
Golang实现非空白字符计数并按出现次数排序
实现思路
- 遍历字符串时按Unicode字符(rune)处理,避免多字节字符(如带变音符号的字符、emoji)统计错误
- 遍历过程中跳过所有空白字符(换行、空格、制表符等),累计每个有效字符的出现次数
- 将统计结果转为切片后,按出现次数升序排序,最后按要求格式输出
完整实现代码
package main import ( "fmt" "sort" "unicode" ) func main() { data := ` a bb ccc üüüü ddddd 😀😀😀😀😀😀 dd ` // 初始化统计map,key为rune类型兼容所有Unicode字符 countMap := make(map[rune]int) // range遍历字符串自动按rune解码,不会拆分多字节字符 for _, r := range data { // 跳过所有空白字符 if unicode.IsSpace(r) { continue } countMap[r]++ } // 将map转为切片用于排序 type charCount struct { char rune count int } countList := make([]charCount, 0, len(countMap)) for c, cnt := range countMap { countList = append(countList, charCount{char: c, count: cnt}) } // 按出现次数升序排序 sort.Slice(countList, func(i, j int) bool { return countList[i].count < countList[j].count }) // 按格式输出结果 for _, item := range countList { fmt.Printf("%c %d\n", item.char, item.count) } }
运行结果
运行代码后输出和预期完全一致:
a 1 b 2 c 3 ü 4 😀 6 d 7
注意点
- 不要按字节遍历字符串,否则多字节的Unicode字符会被拆成多个独立字节,导致统计结果完全错误
- 不要手动判断空格、换行符,直接用标准库
unicode.IsSpace()可以覆盖所有Unicode定义的空白字符,兼容性更好 - Go原生map遍历顺序随机,必须转成切片后自定义排序规则才能得到固定顺序的输出
内容的提问来源于stack exchange,提问作者guettli
相关产品推荐
相关产品推荐

