67 lines
1.2 KiB
Go
67 lines
1.2 KiB
Go
package main
|
|
|
|
import "fmt"
|
|
|
|
type collection interface {
|
|
iterator() func() (interface{}, bool)
|
|
}
|
|
|
|
type intSlice []int
|
|
|
|
func (s intSlice) iterator() func() (interface{}, bool) {
|
|
i := 0
|
|
return func() (interface{}, bool) {
|
|
if i >= len(s) {
|
|
return 0, false
|
|
}
|
|
v := s[i]
|
|
i++
|
|
return v, true
|
|
}
|
|
}
|
|
|
|
type runeList string
|
|
|
|
func (s runeList) iterator() func() (interface{}, bool) {
|
|
c := make(chan rune)
|
|
go func() {
|
|
for _, r := range s {
|
|
c <- r
|
|
}
|
|
close(c)
|
|
}()
|
|
return func() (interface{}, bool) {
|
|
r, ok := <-c
|
|
return string(r), ok
|
|
}
|
|
}
|
|
|
|
func main() {
|
|
fmt.Println(mode(intSlice{2, 7, 1, 8, 2}))
|
|
fmt.Println(mode(runeList("Enzyklopädie")))
|
|
}
|
|
|
|
func mode(a collection) []interface{} {
|
|
m := make(map[interface{}]int)
|
|
i := a.iterator()
|
|
for {
|
|
v, ok := i()
|
|
if !ok {
|
|
break
|
|
}
|
|
m[v]++
|
|
}
|
|
var mode []interface{}
|
|
var n int
|
|
for k, v := range m {
|
|
switch {
|
|
case v < n:
|
|
case v > n:
|
|
n = v
|
|
mode = append(mode[:0], k)
|
|
default:
|
|
mode = append(mode, k)
|
|
}
|
|
}
|
|
return mode
|
|
}
|