41 lines
1.1 KiB
Go
41 lines
1.1 KiB
Go
package main
|
|
|
|
//
|
|
// a word-count application "plugin" for MapReduce.
|
|
//
|
|
// go build -buildmode=plugin wc.go
|
|
//
|
|
|
|
import "6.5840/mr"
|
|
import "unicode"
|
|
import "strings"
|
|
import "strconv"
|
|
|
|
// The map function is called once for each file of input. The first
|
|
// argument is the name of the input file, and the second is the
|
|
// file's complete contents. You should ignore the input file name,
|
|
// and look only at the contents argument. The return value is a slice
|
|
// of key/value pairs.
|
|
func Map(filename string, contents string) []mr.KeyValue {
|
|
// function to detect word separators.
|
|
ff := func(r rune) bool { return !unicode.IsLetter(r) }
|
|
|
|
// split contents into an array of words.
|
|
words := strings.FieldsFunc(contents, ff)
|
|
|
|
kva := []mr.KeyValue{}
|
|
for _, w := range words {
|
|
kv := mr.KeyValue{w, "1"}
|
|
kva = append(kva, kv)
|
|
}
|
|
return kva
|
|
}
|
|
|
|
// The reduce function is called once for each key generated by the
|
|
// map tasks, with a list of all the values created for that key by
|
|
// any map task.
|
|
func Reduce(key string, values []string) string {
|
|
// return the number of occurrences of this word.
|
|
return strconv.Itoa(len(values))
|
|
}
|