Golang sortfunc

Ordenando Slices

Em Go, ordernar um slice é frequentemente necessário quando estamos trabalhando com dados que precisam ser organizados ou estruturados para uma melhor usabilidade, eficiência, ou apresentação. Aqui estão alguns cenários onde você pode precisar ordenar um slice.

Exibindo dados ordenados

Melhorar a eficiência de uma busca

Customizar um Ranking ou Priorização

Limpeza de dados e Organização

Função SortFunc

Para ordenar um slice nós podemos utilizar a função slices.SortFunc.

A função slices.SortFunc recebe um slice e uma função de comparação para ordenar os values.

Essa função de comparação retorna -1 se a < b, 1 se a > b e 0 se os valores forem iguais.

var mySlice []string

mySlice = append(mySlice, "A")
mySlice = append(mySlice, "B")
mySlice = append(mySlice, "C")
mySlice = append(mySlice, "Z")
mySlice = append(mySlice, "M")
mySlice = append(mySlice, "Y")
mySlice = append(mySlice, "P")

slices.SortFunc(mySlice, func(a, b string) int {
    return strings.Compare(a, b)
})

for _, v := range mySlice {
    fmt.Println(v)
}
>>> A
>>> B
>>> C
>>> M
>>> P
>>> Y
>>> Z

Se nós quisermos ordernar um slice de inteiros, nós podemos alterar a função dessa maneira:

var mySlice []int

mySlice = append(mySlice, 55)
mySlice = append(mySlice, 53)
mySlice = append(mySlice, 105)
mySlice = append(mySlice, 3)
mySlice = append(mySlice, 375)
mySlice = append(mySlice, 376)
mySlice = append(mySlice, 377)
mySlice = append(mySlice, 250)
mySlice = append(mySlice, 15)

slices.SortFunc(mySlice, func(a, b int) int {
    return a - b
})

for _, v := range mySlice {
    fmt.Println(v)
}
>>> 3
>>> 15
>>> 53
>>> 55
>>> 105
>>> 250
>>> 375
>>> 376
>>> 377

Ordenando um mapa

Se nós precisarmos ordenar um map, nós podemos criar uma struct para armazenar os valores do map, e então nós podemos ordenar o slice dessa struct.

package main

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

func main() {
	fmt.Println("Starting")

	var myMap = map[string]int{
		"G": 7,
		"B": 2,
		"C": 3,
		"E": 5,
		"A": 1,
		"D": 4,
		"H": 8,
		"F": 6,
	}

	type kv struct {
		Key   string
		Value int
	}

	var kvSlice []kv
	for k, v := range myMap {
		kvSlice = append(kvSlice, kv{Key: k, Value: v})
	}

	for k, v := range kvSlice {
		fmt.Println(k, v)
	}

	fmt.Println("----------")

	slices.SortFunc(kvSlice, func(a, b kv) int {
		return strings.Compare(a.Key, b.Key)
	})

	for k, v := range kvSlice {
		fmt.Println(k, v)
	}

}
>>> 55
>>> 53
>>> 105
>>> 3
>>> 375
>>> 376
>>> 377
>>> 250
>>> 15
>>> ----------
>>> 3
>>> 15
>>> 53
>>> 55
>>> 105
>>> 250
>>> 375
>>> 376
>>> 377