Golang中也有实用的泛型编程模板。如map。据Go官方团队称,其实现为Hash表,而非类似cpp或Java的红黑树。所以理论上速度更能快上几个等级(Hash与红黑树的效率对比可以看我的文章C++中各种<string,T>关联方式的速度对比,效率比约为3:1),但有一些区别,就是遍历时,数据是无需且随机的(当然,后文会讲到有序化的方法)。接下来,我们先创建一个map对象。
dict:=make(map[string]int);
由于map的强类型,所以一切类型是静态的,map也不例外。从make函数中可以看出,本map的索引(键)值是一个string类型,而数据值是一个整数。下面,我们向其中插入一个键值对。
dict["is"]:=1;
很简单,没有必要用其他成员函数,直接用与数组一样的访问方法即可,简单、自然。
如果一个map已经建立好了,怎么输出呢。由于其中的每个数据都是一个pair,所以for循环遍历时也要用两个变量来分别表示键与值。如此(k为键,v为数据值):
for k,v:=range gets{
fmt.Printf("\"%s\": %d\n", k, v)
}
知道这些就可以顺利地制作单词统计器了。思路实在太简单,然而,这并不是重点——重心总会使两边平衡。写完前文的单词统计器以后,有可能你就会发现,输出的数据完全无需,不仅和键无关,甚至和插入顺序也毫无联系(侧面证明了底层确实为Hash表实现)。要使输出按原文中每个单词出现的首次来排序的话,或许需要这么实现:用两个map!
设这里有两个map(map[string]int)map1和map2。map1储存位置,map2储存值。每次插入的时候需要这么做(设key为键,value为值,i为单词的位置):
map1[key]=min(map1[key],i);//先得设成一个较大数
map2[key]=map2[key]+1;
输出的时候,则先取出map中所有元素,然后以map1作为关键字升序排序,最后输出map2的键值对即可。