Go 查找文本中最常用的字符
我需要实现一个带有接口的包,该接口的方法可以获取文本文件并对其执行分析—计算字符总数并找到最常用的符号和单词。要在文本中的每个符文中找到我循环使用的最频繁的字符,请将其转换为字符串并将其作为键附加到Go 查找文本中最常用的字符,go,Go,我需要实现一个带有接口的包,该接口的方法可以获取文本文件并对其执行分析—计算字符总数并找到最常用的符号和单词。要在文本中的每个符文中找到我循环使用的最频繁的字符,请将其转换为字符串并将其作为键附加到map。该值是递增的计数器,用于计算此字符在给定文本中出现的频率。现在我有点被下面的问题困住了——我不知道如何获取地图中具有最高值的密钥。代码如下: package textscanner import ( "fmt" "log" "io/ioutil" "unico
map
。该值是递增的计数器,用于计算此字符在给定文本中出现的频率。现在我有点被下面的问题困住了——我不知道如何获取地图中具有最高值的密钥。代码如下:
package textscanner
import (
"fmt"
"log"
"io/ioutil"
"unicode/utf8"
"strconv"
)
// Initializing my scanner
type Scanner interface {
countChar(text string) int
frequentSym(text string) // Return value is not yet implemented
Scan()
Run()
}
/* method counting characters */
func countChar(sc Scanner, text string) int { ... }
func frequentSym(sc Scanner, text string) {
// Make a map with string key and integer value
symbols := make(map[string] int)
// Iterate through each char in text
for _, sym := range text {
// Convert rune to string
char := strconv.QuoteRune(sym)
// Set this string as a key in map and assign a counter value
count := symbols[char]
if count == symbols[char] {
// increment the value
symbols[char] = count + 1
} else {
symbols[char] = 1
}
}
}
因此,基本上我需要找到一个具有最高
int
值的对,并返回一个与之对应的字符串
键,这是文本中最常见的字符只需在映射上迭代:
maxK := ""
maxV := 0
for k, v := range symbols {
if v > maxV {
maxV = v
maxK = k
}
}
// maxK is the key with the maximum value.
只需在地图上迭代:
maxK := ""
maxV := 0
for k, v := range symbols {
if v > maxV {
maxV = v
maxK = k
}
}
// maxK is the key with the maximum value.
在@Ainar-G answer上展开,如果您的地图可能包含多个出现次数相同的键,那么@Ainar-G代码每次都可能返回不同的结果,因为Go地图本质上是无序的;换句话说,贴图中第一个值高于所有先前值的键将成为最高键,但您并不总是知道该值是否会首先出现在贴图中。请看一个例子 为了使代码具有确定性,您需要解决两个键具有相同值的情况。一个简单的实现是在值相同的情况下进行字符串比较
maxK := ""
maxV := 0
for k, v := range symbols {
if v > maxV || (v == maxV && k < maxK) {
maxV = v
maxK = k
}
}
maxK:=“”
最大值:=0
对于k,v:=范围符号{
如果v>maxV | |(v==maxV&&k
在@Ainar-G answer上展开,如果您的地图可能包含多个出现次数相同的键,那么@Ainar-G代码每次都可能返回不同的结果,因为Go地图本身是无序的;换句话说,贴图中第一个值高于所有先前值的键将成为最高键,但您并不总是知道该值是否会首先出现在贴图中。请看一个例子
为了使代码具有确定性,您需要解决两个键具有相同值的情况。一个简单的实现是在值相同的情况下进行字符串比较
maxK := ""
maxV := 0
for k, v := range symbols {
if v > maxV || (v == maxV && k < maxK) {
maxV = v
maxK = k
}
}
maxK:=“”
最大值:=0
对于k,v:=范围符号{
如果v>maxV | |(v==maxV&&k
为什么要将符文转换为字符串,难道你不能只使用符文作为映射键,即map[rune]int
?为什么要将符文转换为字符串,难道你不能只使用符文作为映射键,即map[rune]int
?谢谢,它可以工作!但我的文本中最常见的字符似乎是“”(即空格),有没有办法将其从我的地图中排除?@AlexNikolaev94 Justdelete(symbols,”)
?谢谢,它可以工作!但我的文本中最常见的字符似乎是“”(即空格),有没有办法将其从我的地图中排除?@AlexNikolaev94 Justdelete(symbols,”)
?