练习 4.8: 修改charcount程序,使用unicode.IsLetter等相关的函数,统计字母、数字等Unicode中不同的字符类别。

练习 4.9: 编写一个程序wordfreq程序,报告输入文本中每个单词出现的频率。在第一次调用Scan前先调用input.Split(bufio.ScanWords)函数,这样可以按单词而不是按行输入。

  1. // Charcount computes counts of Unicode characters.
  2. package main
  3.  
  4. import (
  5. "bufio"
  6. "fmt"
  7. "io"
  8. "os"
  9. "unicode"
  10. "unicode/utf8"
  11. )
  12.  
  13. func main() {
  14. //counts := make(map[string]map[rune]int) // counts of Unicode characters
  15. var utflen [utf8.UTFMax + 1]int // count of lengths of UTF-8 encodings
  16. invalid := 0 // count of invalid UTF-8 characters
  17.  
  18. letters := make(map[rune]int)
  19. numbers := make(map[rune]int)
  20. in := bufio.NewReader(os.Stdin)
  21. for {
  22. r, n, err := in.ReadRune() // returns rune, nbytes, error
  23. if err == io.EOF {
  24. break
  25. }
  26. if err != nil {
  27. fmt.Fprintf(os.Stderr, "charcount: %v\n", err)
  28. os.Exit(1)
  29. }
  30. if r == unicode.ReplacementChar && n == 1 {
  31. invalid++
  32. continue
  33. }
  34. /*
  35. 练习 4.8: 修改charcount程序,使用unicode.IsLetter等相关的函数,统计字母、数字等Unicode中不同的字符类别。
  36. */
  37. //判断是字母
  38. if unicode.IsLetter(r){
  39. letters[r]++
  40. }
  41. //判断是数字
  42. if unicode.IsNumber(r){
  43. numbers[r]++
  44. }
  45. //counts[r]++
  46. utflen[n]++
  47. }
  48. fmt.Printf("rune\tcount\n")
  49. for c, n := range letters {
  50. fmt.Printf("%q\t%d\n", c, n)
  51. }
  52. fmt.Printf("rune(number)\tcount\n")
  53. for c, n := range numbers {
  54. fmt.Printf("%q\t%d\n", c, n)
  55. }
  56.  
  57. fmt.Print("\nlen\tcount\n")
  58. for i, n := range utflen {
  59. if i > 0 {
  60. fmt.Printf("%d\t%d\n", i, n)
  61. }
  62. }
  63. if invalid > 0 {
  64. fmt.Printf("\n%d invalid UTF-8 characters\n", invalid)
  65. }
  66. }
  1. package main
  2.  
  3. import (
  4. "bufio"
  5. "fmt"
  6. //"io"
  7. "os"
  8. //"unicode"
  9. //"unicode/utf8"
  10. )
  11.  
  12. func main() {
  13. counts := make(map[string]int)
  14. input := bufio.NewScanner(os.Stdin)
  15. input.Split(bufio.ScanWords)
  16. for input.Scan(){
  17. counts[input.Text()]++
  18. }
  19. for k,v :=range counts{
  20. fmt.Printf("%s == %d \n",k,v)
  21. }
  22. }
  23. /*
  24. 练习 4.9: 编写一个程序wordfreq程序,报告输入文本中每个单词出现的频率。在第一次调用Scan前先调用input.Split(bufio.ScanWords)函数,这样可以按单词而不是按行输入。
  25. */

  

  

[日常] Go语言圣经--Map习题的更多相关文章

  1. [日常] Go语言圣经--Channel习题

    练习 8.3: 在netcat3例子中,conn虽然是一个interface类型的值,但是其底层真实类型是*net.TCPConn,代表一个TCP连接.一个TCP连接有读和写两个部分,可以使用Clos ...

  2. [日常] Go语言圣经--JSON习题2

    练习 4.12: 流行的web漫画服务xkcd也提供了JSON接口.例如,一个 https://xkcd.com/571/info.0.json 请求将返回一个很多人喜爱的571编号的详细描述. 下载 ...

  3. [日常] Go语言圣经--浮点数习题

    练习 3.1: 如果f函数返回的是无限制的float64值,那么SVG文件可能输出无效的多边形元素(虽然许多SVG渲染器会妥善处理这类问题).修改程序跳过无效的多边形. 练习 3.2: 试验math包 ...

  4. [日常] Go语言圣经-匿名函数习题

    Go语言圣经-匿名函数1.拥有函数名的函数只能在包级语法块中被声明,通过函数字面量(function literal),我们可绕过这一限制,在任何表达式中表示一个函数值2.通过这种方式定义的函数可以访 ...

  5. [日常] Go语言圣经-错误,函数值习题

    Go语言圣经-错误 1.panic异常.panic是来自被调函数的信号,表示发生了某个已知的bug 2.任何进行I/O操作的函数都会面临出现错误的可能 3.错误是软件包API和应用程序用户界面的一个重 ...

  6. [日常] Go语言圣经--结构体,JSON习题

    Go语言圣经-结构体 1.结构体是一种聚合的数据类型,是由零个或多个任意类型的值聚合成的实体 2.通常一行对应一个结构体成员,成员的名字在前类型在后,不过如果相邻的成员类型如果相同的话可以被合并到一行 ...

  7. [日常] Go语言圣经--复合数据类型,数组习题

    go语言圣经-复合数据类型 1.以不同的方式组合基本类型可以构造出来的复合数据类型 2.四种类型——数组.slice.map和结构体 3.数组是由同构的元素组成——每个数组元素都是完全相同的类型——结 ...

  8. [日常] go语言圣经-声明,变量,赋值,类型,包和文件习题

    go语言圣经-声明1.四种类型的声明语句:var.const.type和func,分别对应变量.常量.类型和函数实体对象的声明2.包一级声明语句声明的名字可在整个包对应的每个源文件中访问,局部声明的名 ...

  9. [日常] Go语言圣经--接口约定习题

    Go语言圣经-接口1.接口类型是对其它类型行为的抽象和概括2.Go语言中接口类型的独特之处在于它是满足隐式实现的3.Go语言中还存在着另外一种类型:接口类型.接口类型是一种抽象的类型4.一个类型可以自 ...

随机推荐

  1. 背水一战 Windows 10 (46) - 控件(ScrollViewer 基础): ScrollViewer, ScrollBar, ScrollContentPresenter

    [源码下载] 背水一战 Windows 10 (46) - 控件(ScrollViewer 基础): ScrollViewer, ScrollBar, ScrollContentPresenter 作 ...

  2. node.js实现WebSocket

    最近在学习“HTML5游戏开发实战”,其中第8章内容是使用WebSocket来构建多人游戏---<你画我猜>.然而在实现过程中,却一直出错: 客户端请求时,服务器端会报错并终止: 而浏览器 ...

  3. Palindrome II

    Problem Statement Given a string s, partition s such that every substring of the partition is a pali ...

  4. 暴破助攻提权:ruadmin

    i春秋作家:yangyangwithgnu 1 缘由 千辛万苦拿下的 webshell 不是 www-data 用户就是 networkservice 权限,要想拓展攻击面.扩大战果,提权,是必经之路 ...

  5. window.location API

    概述 今天被自己鄙视了,竟然不会用window.location.search进行页面传值.现在好好总结下window.location API,记录一下供以后开发时参考,相信对其它人也有用. 页面传 ...

  6. Shell - 简明Shell入门03 - 字符串(String)

    示例脚本及注释 #!/bin/bash str="Shell" str2="Hello $str !" str3="Hello ${str} !&qu ...

  7. 如何进行bug总结

    在项目过程中,测试同学会发现大量的bug,但同时也不可避免的会存在一些遗漏的bug.为了能够减少遗漏bug的现象,我们需要针对遗漏的问题进行总结,从教训中积累经验,总结方法,从而提高测试的覆盖度,提升 ...

  8. Android 9 新功能 及 API 介绍(提供了实用的模块化的功能支持,包括 人工智能)

      Android 9(API 级别 28)为用户和开发者引入了众多新特性和新功能. 本文重点介绍面向开发者的新功能. 要了解新 API,请阅读 API 差异报告或访问 Android API 参考. ...

  9. Java读取文件加锁代码Demo(利用Java的NIO)

    本博文部分转载于:http://blog.csdn.net/wangbaochu/article/details/48546717 Java 提供了文件锁FileLock类,利用这个类可以控制不同程序 ...

  10. Jmeter测试Mysql数据库-入门篇

    一.jmter配置数据库 1.在配置jmter之前需要先安装数据库连接池驱动,进入到官方下载页面https://dev.mysql.com/downloads/connector/j/,下载对应的驱动 ...