文章目录
目录
- 一、 案例目标
- 二、 应用场景举例
- 三、 涉及知识点讲解
- 四、实现需求
- 五、 完整代码实现
- 六、运行示例
- 七、 核心代码解析
- 八、 拓展练习建议
- 九、 常见错误提示
- 小结
本案例将实现一个程序,接收用户输入的一段文字,并统计其中每个字符(包括中文、英文、数字等)出现的次数,并按字符输出。
例如输入:
Hello, 世界!
输出:
H: 1
e: 1
l: 2
o: 1
,: 1
: 1
世: 1
界: 1
!: 1
- 文本分析、关键词提取
- 字符频率统计(用于密码分析、数据挖掘)
- 字符画处理(字符权重)
- AI、自然语言处理基础任务之一
| 知识点 | 说明 |
|---|---|
| map[rune]int | Go 中用于统计频率的典型用法 |
| rune | 支持 Unicode 字符(中文、表情、特殊符号) |
| for _, r := range str | 正确遍历字符串每个字符(而不是每个字节) |
- 用户输入任意一段文字;
- 程序逐个字符统计出现次数;
- 忽略字节编码问题,支持中文;
- 输出格式整齐,便于查看;
- 可拓展成图表/词云工具基础。
package main
import (
"bufio"
"fmt"
"os"
"sort"
)
func main() {
reader := bufio.NewReader(os.Stdin)
fmt.Print("请输入一段文字:")
input, _ := reader.ReadString('n')
counts := countCharacters(input)
// 排序输出
var keys []rune
for k := range counts {
keys = append(keys, k)
}
sort.Slice(keys, func(i, j int) bool {
return keys[i] < keys[j]
})
fmt.Println("n字符统计结果:")
for _, r := range keys {
fmt.Printf("%q: %dn", r, counts[r])
}
}
// 统计字符出现次数
func countCharacters(s string) map[rune]int {
result := make(map[rune]int)
for _, r := range []rune(s) {
result[r]++
}
return result
}
示例1:
请输入一段文字:hello, 世界
字符统计结果:
't': 1
',': 1
'e': 1
'h': 1
'l': 2
'o': 1
'世': 1
'界': 1
'n': 1
'n' 和 't' 说明:默认输入带有换行符,可根据需要清洗。
| 代码段 | 说明 |
|---|---|
| map[rune]int | 创建一个以字符为键、出现次数为值的映射 |
| []rune(s) | 将字符串转为字符切片,避免中文字符拆分错误 |
| sort.Slice | 将输出结果按字符顺序排序 |
- 排除空格或标点,只统计字母与数字;
- 将结果写入文件保存;
- 改为支持词语统计(用
strings.Fields() 分词);
- 输出词频图或柱状图(结合
github.com/olekukonko/tablewriter 或 ASCII 图表库);
strings.Fields() 分词);github.com/olekukonko/tablewriter 或 ASCII 图表库);
- 遍历字符串用
[]byte:会导致中文字符被拆成多个 byte;
- 统计字符时忘记使用
rune 类型;
- 输出结果不排序,阅读困难。
[]byte:会导致中文字符被拆成多个 byte;rune 类型;
通过这个案例,你学会了:
- 如何遍历字符串中每一个字符(支持中文)
- 如何使用
map来进行频率统计 - 如何对统计结果进行排序并美观输出
这是实际项目中非常有价值的一种“文本特征提取”技术,是通往 NLP 和算法世界的一扇小门。
到此这篇关于Go语言实现统计字符串中每个字符出现的次数的文章就介绍到这了,更多相关Go统计字符内容请搜索风君子博客以前的文章或继续浏览下面的相关文章希望大家以后多多支持风君子博客!
您可能感兴趣的文章:
- Golang 统计字符串中数字字母数量的实现方法
- Golang 统计字符串字数的方法示例
- Golang编程实现删除字符串中出现次数最少字符的方法
- golang如何判断字符串是否包含中文
- Go语言中字符串四种拼接方式的性能对比