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  }