
Untitled
By: a guest on
Jul 30th, 2012 | syntax:
None | size: 1.68 KB | hits: 11 | expires: Never
package main
import (
"bufio"
"bytes"
"flag"
"fmt"
"io"
"log"
"os"
"sort"
"unicode"
)
type FieldsReader struct {
in *bufio.Reader
buf bytes.Buffer
}
func NewFieldsReader(in io.Reader) *FieldsReader {
return &FieldsReader{in: bufio.NewReader(in)}
}
func (wr *FieldsReader) ReadFieldSlice() ([]byte, os.Error) {
wr.buf.Reset()
r, _, e := wr.in.ReadRune()
for unicode.IsSpace(r) {
if r, _, e = wr.in.ReadRune(); e != nil {
return wr.buf.Bytes(), e
}
}
for !unicode.IsSpace(r) {
wr.buf.WriteRune(r)
if r, _, e = wr.in.ReadRune(); e != nil {
return wr.buf.Bytes(), e
}
}
return wr.buf.Bytes(), nil
}
type WordFreqs []wordFreq
func (s WordFreqs) Len() int { return len(s) }
func (s WordFreqs) Less(i, j int) bool { return s[i].count < s[j].count } // reverse sort
func (s WordFreqs) Swap(i, j int) { s[i], s[j] = s[j], s[i] }
var _ sort.Interface = WordFreqs(nil)
type wordFreq struct {
count int
word string
}
var filename = flag.String("f", "/usr/share/dict/words", "")
func main() {
flag.Parse()
f, err := os.Open(*filename)
if err != nil {
log.Fatal(err)
}
words_map := map[string]int{}
reader := NewFieldsReader(f)
for {
field, err := reader.ReadFieldSlice()
if err != nil {
if err != os.EOF {
log.Fatal(err)
}
break
}
words_map[string(field)]++
}
word_freqs := make(WordFreqs, 0, len(words_map))
for word, count := range words_map {
word_freqs = append(word_freqs, wordFreq{count, word})
}
sort.Sort(word_freqs)
for i, item := range word_freqs {
fmt.Printf("(%d,\t%q)\n", item.count, item.word)
if i >= 10 {
break
}
}
}