slices.Compact în Go

Înlocuiește fiecare șir de elemente egale consecutive cu un singur element (ca uniq din Unix).

Sintaxă
import "slices"

func Compact[S ~[]E, E comparable](s S) S
func CompactFunc[S ~[]E, E any](s S, eq func(E, E) bool) S

Ce face slices.Compact

slices.Compact(s) elimină duplicatele vecine: [1 1 2 2 2 1] devine [1 2 1]. Ca să scoți toate duplicatele dintr-un slice, sortează-l întâi, apoi aplică Compact.

slices.CompactFunc(s, eq) decide egalitatea cu funcția eq și păstrează primul element din fiecare grup. De exemplu tratezi "Iași" și "IAȘI" ca fiind la fel.

Funcția lucrează în memoria slice-ului și returnează slice-ul mai scurt, care trebuie atribuit.

Parametri

Parametru Descriere
s Slice-ul.
eq Pentru CompactFunc: spune dacă două elemente vecine sunt egale.

Ce returnează

Slice-ul fără duplicate consecutive.

Exemple

Exemplul 1: Duplicate vecine și toate duplicatele

package main

import (
    "fmt"
    "slices"
)

func main() {
    s := []int{1, 1, 2, 2, 2, 1, 3, 3}
    fmt.Println(slices.Compact(slices.Clone(s)))

    slices.Sort(s)
    s = slices.Compact(s)
    fmt.Println(s)
}

Rezultat

[1 2 1 3]
[1 2 3]

Exemplul 2: Orașe unice, fără să conteze majusculele

package main

import (
    "fmt"
    "slices"
    "strings"
)

func main() {
    orase := []string{"Iași", "IAȘI", "iași", "Cluj", "cluj", "Arad"}
    orase = slices.CompactFunc(orase, strings.EqualFold)
    fmt.Println(orase)
}

Rezultat

[Iași Cluj Arad]

Greșeli frecvente

  • Aștepți ca Compact să scoată toate duplicatele dintr-un slice nesortat: scoate doar duplicatele aflate unul lângă altul.

Comenzi înrudite

  • slices.Sort: Sortează crescător, pe loc, un slice de orice tip ordonat (numere, texte).
  • slices.Delete: Delete șterge elementele s[i:j]; DeleteFunc șterge toate elementele care îndeplinesc o condiție. Ambele returnează slice-ul nou.
  • maps.Keys: Returnează un iterator peste cheile (Keys) sau valorile (Values) unui map, în ordine aleatorie.