go语言之map练习之(一):统计字母、数字等Unicode中不同的字符类别出现的次数

在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[n]++
   }
   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)
   }

}

猜你喜欢

转载自blog.csdn.net/downer328/article/details/78156674
今日推荐