summaryrefslogtreecommitdiff
path: root/go/grade-school/grade_school.go
blob: 1f2b9f16de4e8aff521fc1b3f20c33fca8f9bf4e (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
package school

import "sort"

type Grade struct {
	Grade int
	Names []string
}

type School struct {
	grades map[int][]string
}

func New() *School {
	return &School{grades: make(map[int][]string)}
}

func (s *School) Add(name string, grade int) {
	g := s.grades[grade]
	g = append(g, name)
	sort.Strings(g)
	s.grades[grade] = g
}

func (s *School) Grade(grade int) []string {
	return s.grades[grade]
}

type ByGrade []Grade

func (g ByGrade) Len() int           { return len(g) }
func (g ByGrade) Less(i, j int) bool { return g[i].Grade < g[j].Grade }
func (g ByGrade) Swap(i, j int)      { g[i], g[j] = g[j], g[i] }

func (s *School) Enrollment() []Grade {
	g := []Grade{}
	for k, v := range s.grades {
		g = append(g, Grade{Grade: k, Names: v})
	}
	sort.Sort(ByGrade(g))
	return g
}