Go语言编写从文件中统计词频并升序输出

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值 升序输出呢。
我这里采用的思路如下,自己瞎想的,可以完善。

    1. 将map 逆转 使得 map1 变成 map2
    1. 将v无重复切片化
    1. 遍历切片 打印 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{}
    // 逆转  -->  
    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])
        }*/
    }
}


Go语言编写从文件中统计词频并升序输出_第1张图片
运行结果

你可能感兴趣的:(Go语言编写从文件中统计词频并升序输出)