go语言之map练习之(一):统计字母、数字等Unicode中不同的字符类别出现的次数
2017-10-03 22:34
656 查看
在GO语言中,一个Map就是一个哈希表的引用。但是Map元素是禁止作取地址操作的。因为map元素不是一个变量,map可能随着元素数量的增长而重新分配更大的内存空间,从而可能导致之前的地址无效。 对Map这种数据类型的理解有以下几点: 1、map中的key类型必须是可以做==运算操作的类型,浮点数作为一个KEY并不是一个好的主意,因为最坏的情况是可能出现的NaN和任何浮点数都不相等 2、用key作为索引下标来访问map将产生一个value。如果key在map中存在,那么将得到与key对应的value;如果key不存在,那么将得到value对应类型的零值。这种特性决定当你要判断在这个map中是否有key时,应该使用以下办法断言:
age, ok := ages[“bob”] if !ok { }//此时,key bob 并不存在于map中,在这个场景中,就会有两个值,一个是age == 0 ,一个则是ok==false 告诉我们bob这个key并不存在,我们就可以据此判断。
3、使用内置的delete函数可以删除元素:
delete(ages, “alice”) // remove element ages[“alice”]
4、map的遍历可以用:range,但是Map的迭代顺序是不确定的,并且不同的哈希函数实现可能导致不同的遍历顺序。在实践中,遍历的顺序是随机的,每一次遍历的顺序都不相同。这是故意的,每次都使用随机的遍历顺序可以强制要求程序不会依赖具体的哈希函数实现。
5、有时,我们可能需要一个map的key 是slices类型,但是slices并不能作==比较,不符合这个条件。这时我们可以通过两个步骤绕过这个限制。第一步,定义一个辅助函数k,将slice转为map对应的string类型的key,确保只有x和y相等时k(x) == k(y)才成立。然后创建一个key为string类型的map,在每次对map操作时先用k辅助函数将slice转化为string类型。
练习 4.8:
func charCount(){//统计输入中每个Unicode码点出现的次数 counts := make(map[rune]int) typeCounts :=make(map[string]int) var uftlen [utf8.UTFMax+1]int invalid :=0 input := bufio.NewReader(os.Stdin) for { r,n,err :=input.ReadRune() if err == io.EOF { break } if err != nil { fmt.Fprintf(os.Stderr,"charcount:%v\n",err) os.Exit(1) } if n == 1 && r == unicode.ReplacementChar { invalid ++ continue } switch { case unicode.IsControl(r): typeCounts["Control"]++ case unicode.IsLetter(r): typeCounts["Letter"]++ case unicode.IsNumber(r): typeCounts["Number"]++ case unicode.IsSpace(r): typeCounts["Space"]++ default: typeCounts["Other"]++ } counts[r]++ uftlen ++ } fmt.Printf("Rune\tCount\n") for c, n := range counts { fmt.Printf("%q\t%d\n",c,n) } fmt.Printf("\nLen\tCount\n") for i, n := range uftlen { if i > 0 { fmt.Printf("%d\t%d\n",i,n) } } fmt.Printf("\nType\tCount\n") for key, value := range typeCounts { fmt.Printf("%s\t%d\n",key,value) } if invalid > 0 { fmt.Printf("\n%d invalid UFT-8 characters\n",invalid) } }
相关文章推荐
- go语言之map练习(二):编写一个程序wordfreq程序,统计输入文本中每个单词出现的频率(次数)
- 【代码】统计文件中,不同字符出现的次数(可排序,没有处理英文单词、数字和大小写)
- 第13周-项目1-小玩文件-用键盘输入文件名,统计输出文件中每个字母、数字字符出现的次数
- 利用Map实现统计一组数字(字母)中每个数字(字母)出现的次数
- 统计字符串里面数字,字母,其他字符的出现次数
- 从文件读取包含数字和字母字符串,统计每个字符出现的次数,将次数输出到另外一个文件
- 对于给定的一个字符串,统计其中数字字符出现的次数。输入数据有多行,第一行是一个整数n,表示测试实例的个数,后面跟着n行,每行包括一个由字母和数字组成的字符串。
- 练习三:统计字符串中字符中 大写字符 小写字符 数字 其他字符 出现的次数
- Map练习--统计字符出现的次数
- 编写一个程序统计各个数字、空白符(包括空格符、制表符及换行符)以及其它字符出现的次数
- 用switch...case语句统计数字、空格和其他字符出现的次数
- oj第九周练习 统计出其中英文字母、数字、空格和其他字符的个数
- 第十三周项目五字符串操作(1)统计每一个数字字符出现的次数
- 统计一段文字中数组、中文、英文字母、空格以及其他特殊字符出现的次数
- 统计每一个数字字符出现的次数
- linux实现针对文本统计字母出现的次数(所有的可打印的字符)
- [每周一算法]统计在一个字符串中各个不同字符出现的次数
- 编写一个程序统计输入字符串中: 各个数字、空白字符、以及其他所有字符出现的次数
- 统计一个字符中中文,英文,数字出现的次数
- C++统计一个文件中每个数字字符(0~9)出现的次数