Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/go/7.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Go 查找文本中最常用的字符_Go - Fatal编程技术网

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 Just
delete(symbols,”)
?谢谢,它可以工作!但我的文本中最常见的字符似乎是“”(即空格),有没有办法将其从我的地图中排除?@AlexNikolaev94 Just
delete(symbols,”)