Go Academy · Lezione

Ordini di ordinamento personalizzati

Definire funzioni di confronto

Lezione 2 di 413 passaggi

Ordini di ordinamento personalizzati è una lezione Go Academy gratuita su CoddyKit. Questa è la lezione 2 di 4. Puoi leggere la lezione completa qui gratuitamente — poi esercitati direttamente nel browser con un editor di codice integrato e un tutor IA disponibile 24/7. Fa parte del percorso di apprendimento Go Academy, e i tuoi progressi si sincronizzano tra il web e l'app CoddyKit. Il corso Go Academy include 4 lezioni in totale.

Oltre l'ordine predefinito

L'ordinamento predefinito è crescente. Tuttavia, i dati reali richiedono regole personalizzate: ordinare per lunghezza, per più campi o per un valore calcolato.

La funzione di confronto è il punto in cui si esprime qualsiasi regola desiderata.

La funzione less

Una funzione di confronto per sort.Slice ha la firma func(i, j int) bool. Restituisce true quando l'elemento i deve precedere l'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)
}

Ordinare per lunghezza delle stringhe

Invece dell'ordine alfabetico, confronti il risultato di len() per ogni stringa, così da ordinarle per lunghezza.

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)
}

Ordinare le struct per campo

Scelga un campo qualsiasi della struct per il confronto. Qui le struct dei prodotti vengono ordinate per prezzo.

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)
}

Ordinamento per più campi

Per risolvere i pari merito, confronti un secondo campo quando il primo è uguale. Ordini prima per età e poi per 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)
}

Invertire con sort.Reverse

sort.Reverse avvolge un'implementazione di sort.Interface per invertirne l'ordine. Si abbina a helper come 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)
}

L'interfaccia sort.Interface

Per avere il pieno controllo, implementi sort.Interface: tre metodi, 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)
}

Ordinare per valore calcolato

Il confronto può utilizzare qualsiasi espressione. Ordini i numeri in base alla loro distanza assoluta da 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)
}

Ordinamento senza distinzione tra maiuscole e minuscole

Utilizzi strings.ToLower all'interno del confronto per ignorare la distinzione tra maiuscole e minuscole quando ordina le stringhe.

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 o interfaccia

Esistono due modi per personalizzare l'ordine:

  • sort.Slice - funzione less rapida e inline
  • sort.Interface - tipo denominato riutilizzabile con tre metodi

Preferisca sort.Slice per gli ordinamenti occasionali.

Mantenere puri i confronti

Una funzione di confronto dovrebbe solo leggere gli elementi e restituire un bool. Non deve modificare la slice né avere effetti collaterali, altrimenti l'ordinamento potrebbe comportarsi in modo imprevedibile.

Verifica rapida

Vuole ordinare le persone per età e, a parità di età, per nome. Quale tecnica utilizza?

Riepilogo

Può definire qualsiasi ordine:

  • La funzione less esprime la regola
  • Gli ordinamenti per più campi confrontano un secondo campo in caso di parità
  • sort.Reverse inverte l'ordine; sort.Interface fornisce tipi riutilizzabili
Gratis per iniziare

Impara Go con un tutor IA — gratis

Scrivi ed esegui vero codice nel tuo browser, ricevi aiuto istantaneo da un tutor IA disponibile 24/7, e riprendi da dove hai lasciato sul web o nell'app.

Corsi
51
Lezioni
203

Domande Frequenti

La lezione «Ordini di ordinamento personalizzati» è gratuita?

Sì — il testo completo di «Ordini di ordinamento personalizzati» è gratuito qui sul web. Per esercitarvi in modo interattivo (un editor di codice integrato e un tutor IA 24/7) e sbloccare il resto del corso Go Academy, passa a CoddyKit PRO. Il corso Go Academy include 4 lezioni in totale.

Cosa imparerò in «Ordini di ordinamento personalizzati»?

Definire funzioni di confronto Eserciti Go Academy con codice pratico che esegui direttamente nel browser, e un tutor IA 24/7 risponde alle tue domande mentre lavori sulla lezione.

Ho bisogno di esperienza per iniziare Go Academy?

Non è richiesta alcuna esperienza precedente. Go Academy su CoddyKit è strutturato per principianti e studenti avanzati, quindi puoi iniziare da qui o dall'inizio e procedere al tuo ritmo. Questa è la lezione 2 di 4.

Quanto tempo richiede la lezione «Ordini di ordinamento personalizzati»?

La maggior parte delle lezioni CoddyKit richiede circa 5–10 minuti. Ogni lezione è breve e interattiva, quindi fai progressi costanti e riprendi esattamente da dove hai lasciato su web e app.

Posso scrivere ed eseguire codice in questa lezione Go Academy?

Sì. Ogni lezione Go Academy include un editor di codice integrato, quindi scrivi ed esegui codice reale direttamente nel tuo browser e ricevi feedback istantaneo dall'IA — nessuna configurazione locale necessaria.

Tutte le lezioni di questo corso

  1. Ordinare gli slice
  2. Ordini di ordinamento personalizzati
  3. Cercare dati ordinati
  4. Ordinamento stabile
← Torna a Go Academy