slices.Compare în Go

Compară două slice-uri element cu element (ca în dicționar) și returnează -1, 0 sau +1.

Sintaxă
import "slices"

func Compare[S ~[]E, E cmp.Ordered](s1, s2 S) int
func CompareFunc[S1 ~[]E1, S2 ~[]E2, E1, E2 any](s1 S1, s2 S2, cmp func(E1, E2) int) int

Ce face slices.Compare

slices.Compare(s1, s2) compară slice-urile în ordine lexicografică, ca la cuvintele dintr-un dicționar: se uită la primele elemente diferite și decide după ele. Dacă un slice este începutul celuilalt, cel mai scurt este mai mic. Rezultatul este -1 (s1 < s2), 0 (egale) sau +1 (s1 > s2).

slices.CompareFunc(s1, s2, cmp) folosește funcția cmp pentru elemente. Ambele sunt utile când sortezi slice-uri de slice-uri, de exemplu versiuni de forma [1 22 3].

Parametri

Parametru Descriere
s1, s2 Slice-urile comparate.
cmp Pentru CompareFunc: compară două elemente (negativ, 0, pozitiv).

Ce returnează

-1, 0 sau +1 (la CompareFunc, primul rezultat nenul al lui cmp).

Exemple

Exemplul 1: Ordine lexicografică

package main

import (
    "fmt"
    "slices"
)

func main() {
    fmt.Println(slices.Compare([]int{1, 2, 3}, []int{1, 2, 4}))
    fmt.Println(slices.Compare([]int{1, 2, 3}, []int{1, 2, 3}))
    fmt.Println(slices.Compare([]int{1, 3}, []int{1, 2, 9}))
    fmt.Println(slices.Compare([]int{1, 2}, []int{1, 2, 0}))
}

Rezultat

-1
0
1
-1

Exemplul 2: Sortarea versiunilor

Ca texte, "1.10" ar veni înaintea lui "1.9". Ca slice-uri de numere, ordinea este corectă.

package main

import (
    "fmt"
    "slices"
)

func main() {
    versiuni := [][]int{{1, 10, 0}, {1, 9, 2}, {2, 0, 0}, {1, 9, 10}}
    slices.SortFunc(versiuni, slices.Compare)
    fmt.Println(versiuni)
}

Rezultat

[[1 9 2] [1 9 10] [1 10 0] [2 0 0]]

Greșeli frecvente

  • Aștepți ca slice-ul mai lung să fie mereu mai mare: se compară întâi elementele, iar lungimea decide doar când unul este începutul celuilalt.

Comenzi înrudite

  • slices.Equal: Verifică dacă două slice-uri au aceeași lungime și aceleași elemente, în aceeași ordine; EqualFunc compară cu o funcție proprie.
  • cmp.Compare: Compare returnează -1, 0 sau +1 după cum x este mai mic, egal sau mai mare decât y; Less spune dacă x < y.
  • slices.SortFunc: Sortează un slice după o funcție de comparare care returnează negativ, zero sau pozitiv; SortStableFunc păstrează ordinea celor egali.