Pratybos — parašyk funkcijas
Skaityti apie map neužtenka — reikia rašyti. Penkios užduotys, nuo lengvos iki sunkesnės. Kiekvienai parašyk funkciją, paleisk su pavyzdžiais, tada palygink su sprendimu. Pirma pabandyk pats.
1 (lengva) — tally. Suskaičiuok, kiek kartų pasikartoja kiekvienas žodis.
tally([]string{"a", "b", "a"}) → map[a:2 b:1]
func tally(words []string) map[string]int {
counts := make(map[string]int)
for _, w := range words {
counts[w]++
}
return counts
}
2 (lengva) — distinct. Kiek unikalių reikšmių sąraše? (Map naudojamas kaip aibė (set): svarbu tik raktai.)
distinct([]string{"a", "b", "a"}) → 2
func distinct(xs []string) int {
seen := make(map[string]bool)
for _, x := range xs {
seen[x] = true
}
return len(seen)
}
3 (vidutinė) — merge. Sudėk du skaičių žodynus į naują.
merge(map[string]int{"a": 1}, map[string]int{"a": 2, "b": 5}) → map[a:3 b:5]
func merge(a, b map[string]int) map[string]int {
out := make(map[string]int)
for k, v := range a {
out[k] += v
}
for k, v := range b {
out[k] += v
}
return out
}
4 (vidutinė) — maxKey. Grąžink raktą su didžiausia reikšme (tark, kad nėra lygiųjų).
maxKey(map[string]int{"x": 1, "y": 9, "z": 3}) → "y"
func maxKey(m map[string]int) string {
best := ""
bestN := -1
for k, v := range m {
if v > bestN {
best, bestN = k, v
}
}
return best
}
Kodėl „nėra lygiųjų"? Nes range tvarka atsitiktinė — su dviem lygiom didžiausiom reikšmėm gautum bet kurį raktą, nenuspėjamai. Tas dviprasmiškumas — tai atsitiktinės tvarkos spąstai mažu masteliu.
5 (sunkesnė) — groupByLen. Sugrupuok žodžius pagal ilgį: map[int][]string (reikšmės — sąrašai).
groupByLen([]string{"go", "cat", "hi", "dog"}) → map[2:[go hi] 3:[cat dog]]
func groupByLen(words []string) map[int][]string {
out := make(map[int][]string)
for _, w := range words {
out[len(w)] = append(out[len(w)], w)
}
return out
}
append prie nesamo rakto tiesiog veikia: nulinė sąrašo reikšmė yra nil, o append prie nil pradeda naują sąrašą. Map ir sąrašai gražiai dera tarpusavyje.
Patarimas. Kviesk kiekvieną iš
mainir tikrink su pavyzdžiais. Šios grynos funkcijos — sąrašas įeina, map išeina — kaip tik tokias „prisegsim" sugo test13 pamokoje.