1.文件读取
这里需要用到逐行读取文件内容并将其切片化
func readFile(filePath string) []string { // 返回切片
// 初始化一个切片
list := []string{}
f, err := os.Open(filePath)
if err != nil {
//panic(err)
p("%s 文件不存在", filePath)
}
defer f.Close()
rd := bufio.NewReader(f)
for {
line, err := rd.ReadString('\n') //以'\n'为结束符读入一行
if err != nil || io.EOF == err {
break
}
list = append(list, line)
//fmt.Println("=====", line)
}
return list
}
2. 统计词频
这里用 map 进行词频统计,然后怎么对map 根据 v值 升序输出呢。
我这里采用的思路如下,自己瞎想的,可以完善。
- 将map 逆转 使得 map1<k,v> 变成 map2<v,k>
- 将v无重复切片化
- 遍历切片 打印 map2 就ok 了
func wordCount(list []string) {
s_map := make(map[string]int) //建立map
//对s_arr中的每个字符进行循环
for _, str := range list {
if s_map[str] == 0 { //当还没有统计过该字符时,赋值为1
s_map[str] = 1
} else { //当统计过该字符时,更新计数值+1
s_map[str] = s_map[str] + 1
}
}
// 对map 按 值排序
r_map := make(map[int][]string) // 逆转后的map
// 新建一个切片
values := []int{}
// 逆转 <k,v> --> <v,k>
for k, v := range s_map {
r_map[v] = append(r_map[v], k)
}
// 将 value 切片化
for k, _ := range r_map {
values = append(values, k) // 这里key 不重复
}
sort.Ints(values) // 对切片进行排序,注意这里的排序是原地排序,并且是降序
for i := range values {
p(" ", values[i], r_map[values[i]])
// 也可以按照如下输出
/*count := values[i]
slice := r_map[values[i]]
for i := 0; i < len(slice); i++ {
p(" ", count, slice[i])
}*/
}
}
</v,k></k,v></v,k></k,v>
运行结果
网友评论