Don't like ads? PRO users don't see any ads ;-)
Guest

Untitled

By: a guest on Jul 30th, 2012  |  syntax: None  |  size: 1.68 KB  |  hits: 11  |  expires: Never
download  |  raw  |  embed  |  report abuse  |  print
Text below is selected. Please press Ctrl+C to copy to your clipboard. (⌘+C on Mac)
  1. package main
  2.  
  3. import (
  4.         "bufio"
  5.         "bytes"
  6.         "flag"
  7.         "fmt"
  8.         "io"
  9.         "log"
  10.         "os"
  11.         "sort"
  12.         "unicode"
  13. )
  14.  
  15. type FieldsReader struct {
  16.         in  *bufio.Reader
  17.         buf bytes.Buffer
  18. }
  19.  
  20. func NewFieldsReader(in io.Reader) *FieldsReader {
  21.         return &FieldsReader{in: bufio.NewReader(in)}
  22. }
  23.  
  24. func (wr *FieldsReader) ReadFieldSlice() ([]byte, os.Error) {
  25.         wr.buf.Reset()
  26.         r, _, e := wr.in.ReadRune()
  27.         for unicode.IsSpace(r) {
  28.                 if r, _, e = wr.in.ReadRune(); e != nil {
  29.                         return wr.buf.Bytes(), e
  30.                 }
  31.         }
  32.         for !unicode.IsSpace(r) {
  33.                 wr.buf.WriteRune(r)
  34.                 if r, _, e = wr.in.ReadRune(); e != nil {
  35.                         return wr.buf.Bytes(), e
  36.                 }
  37.         }
  38.         return wr.buf.Bytes(), nil
  39. }
  40.  
  41. type WordFreqs []wordFreq
  42.  
  43. func (s WordFreqs) Len() int           { return len(s) }
  44. func (s WordFreqs) Less(i, j int) bool { return s[i].count < s[j].count } // reverse sort
  45. func (s WordFreqs) Swap(i, j int)      { s[i], s[j] = s[j], s[i] }
  46.  
  47. var _ sort.Interface = WordFreqs(nil)
  48.  
  49. type wordFreq struct {
  50.         count int
  51.         word  string
  52. }
  53.  
  54. var filename = flag.String("f", "/usr/share/dict/words", "")
  55.  
  56. func main() {
  57.         flag.Parse()
  58.         f, err := os.Open(*filename)
  59.         if err != nil {
  60.                 log.Fatal(err)
  61.         }
  62.  
  63.         words_map := map[string]int{}
  64.         reader := NewFieldsReader(f)
  65.         for {
  66.                 field, err := reader.ReadFieldSlice()
  67.                 if err != nil {
  68.                         if err != os.EOF {
  69.                                 log.Fatal(err)
  70.                         }
  71.                         break
  72.                 }
  73.                 words_map[string(field)]++
  74.         }
  75.  
  76.         word_freqs := make(WordFreqs, 0, len(words_map))
  77.         for word, count := range words_map {
  78.                 word_freqs = append(word_freqs, wordFreq{count, word})
  79.         }
  80.  
  81.         sort.Sort(word_freqs)
  82.  
  83.         for i, item := range word_freqs {
  84.                 fmt.Printf("(%d,\t%q)\n", item.count, item.word)
  85.                 if i >= 10 {
  86.                         break
  87.                 }
  88.         }
  89. }