github.com/chenjiandongx/go-queue@v0.0.0-20191023082232-e2a36f382f84/counter.go (about) 1 package collections 2 3 import "sort" 4 5 type Counter struct { 6 kv map[interface{}]int 7 } 8 9 type Item struct { 10 k interface{} 11 v int 12 } 13 14 func NewCounter() *Counter { 15 return &Counter{make(map[interface{}]int)} 16 } 17 18 func (c *Counter) Add(keys ...interface{}) { 19 for i := 0; i < len(keys); i++ { 20 c.kv[keys[i]]++ 21 } 22 } 23 24 func (c *Counter) Get(key interface{}) int { 25 return c.kv[key] 26 } 27 28 func (c *Counter) GetAll() []Item { 29 return c.sortMap() 30 } 31 32 func (c *Counter) Top(n int) []Item { 33 sortItems := c.sortMap() 34 if n > c.Len() || n < 0 { 35 n = c.Len() 36 } 37 return sortItems[:n] 38 } 39 40 func (c *Counter) Delete(key interface{}) bool { 41 if _, ok := c.kv[key]; ok { 42 delete(c.kv, key) 43 return true 44 } 45 return false 46 } 47 48 func (c *Counter) Len() int { 49 return len(c.kv) 50 } 51 52 func (c *Counter) sortMap() []Item { 53 var items []Item 54 for k, v := range c.kv { 55 items = append(items, Item{k, v}) 56 } 57 58 sort.Slice(items, func(i, j int) bool { 59 return items[i].v > items[j].v 60 }) 61 return items 62 }