统计一个字符串中每个单词出现的次数,主要思路是:
- 1.将字符串中的单词分割并存入slice
- 2.从slice中取出单词并存入map,存入过程中完成计数
- 3.打印结果
编写过程中遇到的主要问题:字符串如果是完整的句子,就会包含空格和标点符号,直接调用strings包中的Split
函数没有办法进行很好的切分。
解决代码如下:
package main
import (
"fmt"
"unicode"
)
// 统计一个字符串中每个单词出现的次数。例如:"Hello, how do you do?"中,how=1,do=2,you=1
func main() {
ss := "Hello, how do you do?" // 定义一个字符串(字符串需要有标点符号做结尾)
// 1.将字符串中的单词分割并存入slice
// 可以直接使用strings包里面的Split函数进行切分,不过当字符串有多种分隔符的时候此方法不好用
// sl = strings.Split(ss, " ")
// 下面的方法可以识别出包含空格和标点符号等多种分割符的字符串
var sl = make([]string, 0, 6) // 初始化时,长度要为0
var word string // 定义一个变量用来接收单词
word = ""
for _, w := range ss { // 遍历字符串
if !unicode.IsLetter(w) { // 遇到非字母元素,说明一个单词结束,将单词存入slice中,并且重置word变量
if word != "" { // 由于可能存在两个或者多个的非字母字符相邻,所以在录入slice之前应该进行一次判断
sl = append(sl, word)
}
word = ""
continue
} else {
word = fmt.Sprintf("%s%c", word, w) // 字母元素拼接到word后面,组成单词
}
}
// 2.将单词存入map中并计数
wordsMap := make(map[string]int, 6) // 初始化一个map用来统计和存储结果
for _, keyWord := range sl {
wordsMap[keyWord]++
}
// 3.打印结果
for key, value := range wordsMap {
fmt.Printf("%s: %d\n", key, value)
}
}
运行结果如图,