You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Go语言如何实现字符串非空白字符计数并按频次排序输出

Golang实现非空白字符计数并按出现次数排序

实现思路

  • 遍历字符串时按Unicode字符(rune)处理,避免多字节字符(如带变音符号的字符、emoji)统计错误
  • 遍历过程中跳过所有空白字符(换行、空格、制表符等),累计每个有效字符的出现次数
  • 将统计结果转为切片后,按出现次数升序排序,最后按要求格式输出

完整实现代码

package main

import (
	"fmt"
	"sort"
	"unicode"
)

func main() {
	data := `
    a
    bb
    ccc
    üüüü
    ddddd
    😀😀😀😀😀😀
    dd
    `
	// 初始化统计map,key为rune类型兼容所有Unicode字符
	countMap := make(map[rune]int)

	// range遍历字符串自动按rune解码,不会拆分多字节字符
	for _, r := range data {
		// 跳过所有空白字符
		if unicode.IsSpace(r) {
			continue
		}
		countMap[r]++
	}

	// 将map转为切片用于排序
	type charCount struct {
		char  rune
		count int
	}
	countList := make([]charCount, 0, len(countMap))
	for c, cnt := range countMap {
		countList = append(countList, charCount{char: c, count: cnt})
	}

	// 按出现次数升序排序
	sort.Slice(countList, func(i, j int) bool {
		return countList[i].count < countList[j].count
	})

	// 按格式输出结果
	for _, item := range countList {
		fmt.Printf("%c %d\n", item.char, item.count)
	}
}

运行结果

运行代码后输出和预期完全一致:

a 1
b 2
c 3
ü 4
😀 6
d 7

注意点

  • 不要按字节遍历字符串,否则多字节的Unicode字符会被拆成多个独立字节,导致统计结果完全错误
  • 不要手动判断空格、换行符,直接用标准库unicode.IsSpace()可以覆盖所有Unicode定义的空白字符,兼容性更好
  • Go原生map遍历顺序随机,必须转成切片后自定义排序规则才能得到固定顺序的输出

内容的提问来源于stack exchange,提问作者guettli

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.30 22:03:23