我正在尝试编写一个看似简单的函数,该函数根据读取文本文件的结果创建一个字典,其中键是文本中找到的单词,值是它在文本中重复的次数。文件。
然而,由于我不知道的原因,地图只是拒绝访问现有密钥,而是创建一个相同的密钥。
这是怎么回事?我该如何解决?
代码:
file, _ := os.Open("text.txt")
defer file.Close()
buffer := make([]byte, 1024)
file.Read(buffer)
splited := strings.Split(string(buffer), " ")
dictionary := make(map[string]int)
for _, word := range splited {
if word != "" {
seeking := strings.Trim(strings.ToLower(word), " ")
if _, ok := dictionary[seeking]; ok {
dictionary[seeking] += 1
} else {
dictionary[seeking] = 1
}
}
}
fmt.Println(dictionary)
文本.txt:
1 2 3 4 5 6 7 8 9 1 2 3 4 5 6 7 8 9 9
出去:
map[1:2 2:2 3:2 4:2 5:2 6:2 7:2 8:2 9:2 9:1]
相反,
fmt.Println(dictionary)打印出字典的调试表示fmt.Printf("%#v\n", dictionary)您将看到以下内容:
也就是说,字典中的最后九根本不是九,而是“9 + 一千个零字节”,即缓冲区的整个尾部。
您不需要将整个缓冲区转换为字符串,而只需将填充的部分转换为字符串
结果:
如何提高
恕我直言,制作自己的解析器,甚至逐块读取,肯定会在某个地方搬起石头砸自己的脚。我会使用扫描仪
bufio.Scaner,它开箱即用,可以分解成线条、单词或字母。另外,我会在单词的开头和结尾添加标点符号的删除。它应该留在中间,以便正确处理内部带有连字符的单词(例如,俄语中的)