0Pricing
Go Academy · Aula

Ordens de classificação personalizadas

Defina funções de comparação

Ordens de classificação personalizadas é uma aula grátis de Go Academy no CoddyKit. Esta é a aula 2 de 4. Você pode ler a aula completa abaixo gratuitamente — depois pratica ao vivo no navegador com um editor de código integrado e um tutor de IA 24/7. Faz parte do caminho de aprendizado de Go Academy, e seu progresso é sincronizado entre a web e o app CoddyKit. O curso de Go Academy inclui 4 aulas no total.

Além da ordem padrão

A ordenação padrão é crescente. Mas dados reais exigem regras personalizadas: ordenar por comprimento, por vários campos ou por um valor calculado.

A função de comparação é onde você expressa qualquer regra que quiser.

A função de comparação

Uma função de comparação para sort.Slice tem a assinatura func(i, j int) bool. Ela retorna true quando o elemento i deve vir antes do elemento j.

package main

import (
	"fmt"
	"sort"
)

func main() {
	nums := []int{4, 1, 3}
	less := func(i, j int) bool { return nums[i] < nums[j] }
	sort.Slice(nums, less)
	fmt.Println(nums)
}

Ordenar pelo comprimento da cadeia

Em vez da ordem alfabética, compare len() de cada cadeia de caracteres para ordená-las pelo comprimento.

package main

import (
	"fmt"
	"sort"
)

func main() {
	words := []string{"pear", "fig", "banana"}
	sort.Slice(words, func(i, j int) bool {
		return len(words[i]) < len(words[j])
	})
	fmt.Println(words)
}

Ordenar estruturas por campo

Escolha qualquer campo da estrutura para fazer a comparação. Aqui, ordenamos produtos por preço.

package main

import (
	"fmt"
	"sort"
)

type Product struct {
	Name  string
	Price int
}

func main() {
	items := []Product{{"Pen", 3}, {"Book", 12}, {"Cup", 7}}
	sort.Slice(items, func(i, j int) bool {
		return items[i].Price < items[j].Price
	})
	fmt.Println(items)
}

Ordenação por vários campos

Para desempatar, compare um segundo campo quando o primeiro for igual. Ordene por idade e, depois, por nome.

package main

import (
	"fmt"
	"sort"
)

type Person struct {
	Name string
	Age  int
}

func main() {
	p := []Person{{"Zoe", 30}, {"Ann", 30}, {"Bob", 25}}
	sort.Slice(p, func(i, j int) bool {
		if p[i].Age != p[j].Age {
			return p[i].Age < p[j].Age
		}
		return p[i].Name < p[j].Name
	})
	fmt.Println(p)
}

Inverter com sort.Reverse

sort.Reverse envolve uma sort.Interface para inverter a ordem. Ele funciona em conjunto com auxiliares como sort.IntSlice.

package main

import (
	"fmt"
	"sort"
)

func main() {
	nums := []int{1, 4, 2, 3}
	sort.Sort(sort.Reverse(sort.IntSlice(nums)))
	fmt.Println(nums)
}

A sort.Interface

Para ter controle total, implemente sort.Interface: três métodos, Len(), Less(i, j int) bool e Swap(i, j int).

package main

import (
	"fmt"
	"sort"
)

type ByLen []string

func (s ByLen) Len() int           { return len(s) }
func (s ByLen) Less(i, j int) bool { return len(s[i]) < len(s[j]) }
func (s ByLen) Swap(i, j int)      { s[i], s[j] = s[j], s[i] }

func main() {
	w := []string{"ccc", "a", "bb"}
	sort.Sort(ByLen(w))
	fmt.Println(w)
}

Ordenar por valor calculado

A comparação pode usar qualquer expressão. Ordene os números pela distância absoluta deles em relação a zero.

package main

import (
	"fmt"
	"sort"
)

func abs(n int) int {
	if n < 0 {
		return -n
	}
	return n
}

func main() {
	nums := []int{-5, 2, -1, 3}
	sort.Slice(nums, func(i, j int) bool {
		return abs(nums[i]) < abs(nums[j])
	})
	fmt.Println(nums)
}

Ordenação sem distinção entre maiúsculas e minúsculas

Use strings.ToLower dentro da comparação para ignorar maiúsculas e minúsculas ao ordenar cadeias de caracteres.

package main

import (
	"fmt"
	"sort"
	"strings"
)

func main() {
	w := []string{"banana", "Apple", "cherry"}
	sort.Slice(w, func(i, j int) bool {
		return strings.ToLower(w[i]) < strings.ToLower(w[j])
	})
	fmt.Println(w)
}

Slice versus Interface

Há duas maneiras de personalizar a ordem:

  • sort.Slice - função de comparação rápida e integrada ao código
  • sort.Interface - tipo nomeado reutilizável com três métodos

Prefira sort.Slice para ordenações pontuais.

Mantenha as comparações puras

Uma função de comparação deve apenas ler os elementos e retornar um valor booleano. Ela não deve modificar a fatia nem produzir efeitos colaterais, ou a ordenação poderá se comportar de forma imprevisível.

Verificação rápida

Você quer ordenar pessoas por idade e, quando as idades forem iguais, por nome. Qual técnica deve usar?

Recapitulação

Você pode definir qualquer ordem de ordenação:

  • A função de comparação expressa a sua regra
  • Ordenações por vários campos comparam um segundo campo em caso de empate
  • sort.Reverse inverte a ordem; sort.Interface fornece tipos reutilizáveis

Perguntas Frequentes

A aula “Ordens de classificação personalizadas” é grátis?

Sim — o texto completo de “Ordens de classificação personalizadas” é grátis para ler aqui na web. Para praticá-la interativamente (um editor de código integrado e um tutor de IA 24/7) e desbloquear o restante do curso de Go Academy, atualize para CoddyKit PRO. O curso de Go Academy inclui 4 aulas no total.

O que vou aprender em “Ordens de classificação personalizadas”?

Defina funções de comparação Você pratica Go Academy com código prático que executa diretamente no navegador, e um tutor de IA 24/7 responde suas dúvidas enquanto trabalha na aula.

Preciso ter experiência prévia para começar Go Academy?

Nenhuma experiência prévia é necessária. Go Academy no CoddyKit é estruturado para alunos iniciantes até avançados, então você pode começar aqui ou desde o início e aprender no seu ritmo. Esta é a aula 2 de 4.

Quanto tempo leva a aula “Ordens de classificação personalizadas”?

A maioria das aulas CoddyKit leva cerca de 5–10 minutos. Cada uma é compacta e interativa, então você faz progresso constante e retoma exatamente de onde parou entre web e app.

Posso escrever e executar código nesta aula de Go Academy?

Sim. Cada aula de Go Academy inclui um editor de código integrado, então você escreve e executa código real direto no navegador e recebe feedback de IA instantaneamente — nenhuma configuração local necessária.

Todas as aulas deste curso

  1. Ordenação de slices
  2. Ordens de classificação personalizadas
  3. Pesquisa em dados ordenados
  4. Ordenação estável
← Voltar para Go Academy