📌  相关文章
📜  Golang 程序查找数组中每个元素的频率

📅  最后修改于: 2022-05-13 01:54:52.504000             🧑  作者: Mango

Golang 程序查找数组中每个元素的频率

给定一个特定数据类型的数组,我们想要找到数组中元素的频率(出现次数)。我们可以借助 Golang 中的地图来做到这一点。通过使用整数创建特定的数据类型映射,我们可以遍历给定的数组并将计数添加到键中,作为该元素在数组中的频率。

整数数组

假设我们有一个定义的 n 个元素的整数数组,我们只是想使用映射映射元素及其在数组中的频率。首先,我们将定义一个数组,它可以根据程序的使用情况由用户生成或输入。在这里,我们将手动填充数组以了解实现。在我们有一个整数数组之后,我们可以创建一个将整数映射到整数的映射,因为我们有一个整数数组,映射中的键将是数组的元素,值作为元素的频率/计数。

我们可以使用 make 来创建地图。只需为要创建的映射编写键类型和值类型。

创建一个空映射后,我们可以遍历整数数组并将其键设置为频率。默认情况下,第一次出现的键的频率设置为零,因此我们可以在第一次访问数组中的元素时将其增加一。

空白标识符 (_) 只是数组的索引,num 是该索引处的元素,因此我们可以遍历数组中的范围,即数组中的元素数。我们使用 num 作为键,它是数组中的元素,map[num] 作为键 num 的值。因此,我们将每个唯一元素的值加一作为键。

下面是完整的程序。

Go
// Go program to find the frequency of an integer array
package main
  
import "fmt"
  
func main(){
    arr := []int{90, 70, 30, 30, 10, 80, 40, 50, 40, 30}
    freq := make(map[int]int)
    for _ , num :=  range arr {
        freq[num] = freq[num]+1
    }
    fmt.Println("Frequency of the Array is : ", freq)
}


Go
// Go program to convert logic into function
package main
  
import "fmt"
  
func main(){
    arr := []int{90, 70, 30, 30, 10, 80, 40, 50, 40, 30}
    freq_map := frequency_map(arr)
    fmt.Println("Frequency of the Array is : ", freq_map)
}
  
func frequency_map( arr []int) map[int]int{
    freq := make(map[int]int)
    for _ , num :=  range arr {
        freq[num] = freq[num]+1
    }
    return freq
}


Go
// Go program to that takes string and map each character
package main
  
import "fmt"
  
func main(){
    arr := "geeksforgeeks"
  
    freq := make(map[string]int)
  
    for _ , char :=  range arr {
        freq[string(char)] = freq[string(char)]+1
    }
  
    fmt.Println("Frequency of Array is : ", freq)
}


Go
// Go program using rune/byte as keys in the map
package main
  
import "fmt"
  
func main(){
    arr := "geeksforgeeks"
  
    freq := make(map[rune]int)
  
    for _ , char :=  range arr {
        freq[char] = freq[char]+1
    }
  
    fmt.Println("Frequency of Array is : ", freq)
}


Go
package main
  
import "fmt"
  
func main(){
    arr := "geeksforgeeks"
  
    freq := make(map[byte]int)
  
    for _ , char :=  range arr {
        freq[byte(char)] = freq[byte(char)]+1
    }
  
    fmt.Println("Frequency of Array is : ", freq)
}


Go
// Go program to converting into function
package main
  
import "fmt"
  
func main(){
    arr := "geeksforgeeks"
    freq_map := frequency_map(arr)
    fmt.Println("Frequency of Array is : ", freq_map)
}
  
func frequency_map(arr string) map[string]int{
    freq := make(map[string]int)
    for _ , char :=  range arr {
        freq[string(char)] = freq[string(char)]+1
    }
    return freq
}


输出:

Frequency of the array is: map[10:1 30:3 40:2 50:1 70:1 80:1 90:1]

因此,正如我们所见,创建了频率图,将数组中的元素映射到它们的出现频率。

转换为函数

我们甚至可以将逻辑转换为为给定整数数组创建频率图的函数。我们只需要将数组解析为参数,将返回类型解析为整数映射,整数作为函数头。创建频率图并使用元素及其频率的键和值填充它的逻辑保持不变。

// Go program to convert logic into function
package main
  
import "fmt"
  
func main(){
    arr := []int{90, 70, 30, 30, 10, 80, 40, 50, 40, 30}
    freq_map := frequency_map(arr)
    fmt.Println("Frequency of the Array is : ", freq_map)
}
  
func frequency_map( arr []int) map[int]int{
    freq := make(map[int]int)
    for _ , num :=  range arr {
        freq[num] = freq[num]+1
    }
    return freq
}

输出:

Frequency of Array is : map [10:1 30:3 40:2 50:1 70:1 80:1 90:1]

因此,我们能够使用 Go 语言中的映射为整数数组创建频率映射。

细绳

假设我们有一个字符串,我们想为字符串中的每个字符创建一个频率计数。在这种情况下,我们将创建一个字符串到整数的映射,我们将字符串中的每个字符存储为字符串,因为方便显示内容并将该字符串字符的计数存储为映射中的值。

注意:我们甚至可以使用 rune 或 byte 类型来代替字符串键,问题在于它将 Unicode/ASCII 代码显示为键,而不是字符串本身。

首先,我们将定义一个字符串。与整数映射类似,我们将创建一个将字符串映射到整数的映射,如下所示:

创建映射后,我们只需字符串字符地迭代字符串并递增键的值,这里的键是字符的字符。我们将字符(字节/符文)类型连接为字符串,只是因为方便人类阅读地图。但是您可以保持原样,然后您可能必须将地图的键类型更改为:

这将创建一个映射,将键存储为字符串中字符的 Unicode 值。

然后我们遍历字符串并递增字符串中字符键的值,如下所示:

所以,最后结合这些部分,我们有一个脚本,它接收一个字符串并将每个字符(字符串类型)映射为键,并将其在字符串中的频率作为其在映射中的值。

// Go program to that takes string and map each character
package main
  
import "fmt"
  
func main(){
    arr := "geeksforgeeks"
  
    freq := make(map[string]int)
  
    for _ , char :=  range arr {
        freq[string(char)] = freq[string(char)]+1
    }
  
    fmt.Println("Frequency of Array is : ", freq)
}

输出:

Frequency of Array is : map[e:4 f:1 g:2 k:2 0:1 r:1 s:2]

因此,我们可以看到我们得到了给定字符串中每个唯一字符的映射,以及它在整个字符串中出现的频率或计数。

使用 rune/byte 作为地图中的键

此外,如果我们使用 run/byte 数据类型创建映射而不将字符连接到字符串,我们将得到如下输出:

// Go program using rune/byte as keys in the map
package main
  
import "fmt"
  
func main(){
    arr := "geeksforgeeks"
  
    freq := make(map[rune]int)
  
    for _ , char :=  range arr {
        freq[char] = freq[char]+1
    }
  
    fmt.Println("Frequency of Array is : ", freq)
}

输出:

Frequency of Array is : map[101:4 102:1 103:2 107:2 111:1 114:1 115:2]

同样是 byte 的输出,除了它不接受不是 ASCII(0 到 255)代码的字符,因此在字符集中非常有限。如果该值超出其字节范围的范围,则该字节将给出编译错误。如果未为字符指定,则选择的默认值是 Go 语言中的符文。尽管如此,如果您想在映射中使用字节作为键,您可以在声明中将其指定为符文,因此您还需要将其与字节连接。

package main
  
import "fmt"
  
func main(){
    arr := "geeksforgeeks"
  
    freq := make(map[byte]int)
  
    for _ , char :=  range arr {
        freq[byte(char)] = freq[byte(char)]+1
    }
  
    fmt.Println("Frequency of Array is : ", freq)
}

输出:

Frequency of Array is : map[101:4 102:1 103:2 107:2 111:1 114:1 115:2]

转换为函数

此外,在这里我们可以通过创建用于创建字符串中字符的频率计数的函数来将程序代码转换为函数方法。

// Go program to converting into function
package main
  
import "fmt"
  
func main(){
    arr := "geeksforgeeks"
    freq_map := frequency_map(arr)
    fmt.Println("Frequency of Array is : ", freq_map)
}
  
func frequency_map(arr string) map[string]int{
    freq := make(map[string]int)
    for _ , char :=  range arr {
        freq[string(char)] = freq[string(char)]+1
    }
    return freq
}

输出:

Frequency of Array is : map[e:4 f:1 g:2 k:2 o:1 r:1 s:2]

因此函数frequency_map 返回映射,它是一个字符串到整数的映射。因此,我们只需将字符串解析为函数并将频率存储在变量中即可获得字符串的频率图。