Tema
/
Struktūrinis programavimas GO
Pamoka 9 / 14 Žodynas (Go map) ~50 min
📖 Teorija

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š main ir tikrink su pavyzdžiais. Šios grynos funkcijos — sąrašas įeina, map išeina — kaip tik tokias „prisegsim" su go test 13 pamokoje.