通过Map的Val值,求得最大的Keys切片

题目需求:一个文本文件中,有一篇以","切割的文章,现要求出,出现率最高的前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)
}


                
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值