39 lines
788 B
Go
39 lines
788 B
Go
package hmm
|
|
|
|
import (
|
|
"sort"
|
|
)
|
|
|
|
// CountNSort consumes a stream of strings, calculates counts of occurances in
|
|
// the stream. After the stream is closed it sorts the unique keys by frequency
|
|
// and returns it as a Results.
|
|
func CountNSort(in <-chan string) Results {
|
|
res := map[string]int{}
|
|
|
|
for i := range in {
|
|
res[i]++
|
|
}
|
|
|
|
r := Results{}
|
|
for k, v := range res {
|
|
r = append(r, Result{k, v})
|
|
}
|
|
|
|
sort.Sort(r)
|
|
|
|
return r
|
|
}
|
|
|
|
// Result encodes a frequency for seen string.
|
|
type Result struct {
|
|
Key string
|
|
Count int
|
|
}
|
|
|
|
// Results exists to sort a slice of Result
|
|
type Results []Result
|
|
|
|
func (r Results) Len() int { return len(r) }
|
|
func (r Results) Swap(i, j int) { r[i], r[j] = r[j], r[i] }
|
|
func (r Results) Less(i, j int) bool { return r[i].Count < r[j].Count }
|