题目需求:一个文本文件中,有一篇以","切割的文章,现要求出,出现率最高的前4个单词
问题分析:
1.文章以逗号分隔,所以通过 strings.Split 求得单词切片集
2.出现次数,通过Map结构 Key-Val : 单词-次数 的结构来做记录
3.那么由上一条分析,现在问题转换为 : 如何通过Map的Val值,取得最大的Keys集
简单实现:
由分析1,2可得
文件1.txt 内容:
1,2,2,3,3,3,4,4,4,4,5,5,5,5,5,6,6,6,6,6,6,7,7,7,7,7,7
func main() {
//读文件
file, err := ioutil.ReadFile("1.txt")
if err != nil {
println("错")
return
}
strs := strings.Split(string(file),",")
//map计数
dict:= map[string]int{}
for _,s := range strs{
//fmt.Println(s)
dict[s]++
}
//求得最大Val的key切片
//。。。
}
思路:
1.遍历Map,用一个切片根据Val值 从小到大装入对应的 Key值。切片长度为4
result := make([]string,resLen)
//使用切片的好处是,切片长度可以根据需求扩展
2.每次遍历的Val值,与切片最小值进行比较
3.若小于最小值,则遍历map的下一个数进行比较,若大于最小值,则与切片的下一个数字进行比较,判断插入位置
得出如下方法:
//根据map的Val值(int类型),求得最大的Key切片
func Sortres(dict map[string]int,resLen int) []string{
result := make([]string,resLen)
//遍历map,判断map长度并初始化result,初始化时,按照从小到大顺序存入,每次遍历map值,循环与最小值比较,判断插入位置
//初始化result
//判断map长度和比较前三元素大小
if len(dict) > resLen {
for k,v := range dict{
flag := true
for i := 0; i < len(result)-1; i++ {
switch {
case v <= dict[result[i]] : //当前值小于最小值
flag = false
case v > dict[result[i]] && v > dict[result[i+1]]: //当前值大于当前元素,也大于上一个元素
if i == len(result)-2 { //如果是最后一次遍历
result = append(result[1:],k) //在末尾插入,且不能改变长度
}
continue
case v > dict[result[i]] && v <= dict[result[i+1]] : //当前值大于当前元素,小于等于上一个元素
result = append(result[1:i+1],append([]string{k},result[i+1:]...)...) //在i+1插入
flag = false
}
if flag { //退出循环
break
}
}
}
}else{ //map长度小于三,直接赋值并返回
for key,_ := range dict{
result = append(result,key)
}
return result
}
return result
}
完整使用示例如下
package main
import (
"fmt"
"io/ioutil"
"strings"
)
//根据map的Val值(int类型),求得最大的Key切片
func Sortres(dict map[string]int,resLen int) []string{
result := make([]string,resLen)
//遍历map,判断map长度并初始化result,初始化时,按照从小到大顺序存入,每次遍历map值,循环与最小值比较,判断插入位置
//初始化result
//判断map长度和比较前三元素大小
if len(dict) > resLen {
for k,v := range dict{
flag := true
for i := 0; i < len(result)-1; i++ {
switch {
case v <= dict[result[i]] : //当前值小于最小值
flag = false
case v > dict[result[i]] && v > dict[result[i+1]]: //当前值大于当前元素,也大于上一个元素
if i == len(result)-2 { //如果是最后一次遍历
result = append(result[1:],k) //在末尾插入,且不能改变长度
}
continue
case v > dict[result[i]] && v <= dict[result[i+1]] : //当前值大于当前元素,小于等于上一个元素
result = append(result[1:i+1],append([]string{k},result[i+1:]...)...) //在i+1插入
flag = false
}
if flag { //退出循环
break
}
}
}
}else{ //map长度小于三,直接赋值并返回
for key,_ := range dict{
result = append(result,key)
}
return result
}
return result
}
//文件中很多单词,找到最多出现的前三个
func main() {
//读文件
file, err := ioutil.ReadFile("./src/基础练习/1.txt")
if err != nil {
println("错")
return
}
strs := strings.Split(string(file),",")
//map计数
dict:= map[string]int{}
for _,s := range strs{
//fmt.Println(s)
dict[s]++
}
result := Sortres(dict,4)
fmt.Println(result)
}