Sort con Funzioni
Esistono funzioni di libreria di sorting già redatte, ma solo in numerp limitato.
Chiunque può implementare il sorting solo implementando l'interfaccia sort.Interface
che richiede la definizione delle funzioni:
Len
- lunghezza dell'oggetto da sortizzareSwap
- come invertire nell'ordine due oggetti da sortizzareLess
- quale dei due oggetti paragonati è minore, secondo i nostri criteri di Sortizzazione
Dati due record, infatti, dipende dal modello del dominio dell'applicazione decidere in quale ordine debbano essere organizzati i record, e con quale criterio.
L'esempio seguente ordina stringhe per lunghezza.
(400sorting-by-functions.go):
// Per sortizzare stringhe per lunghezza occorre
// fornire funzioni custom
package main
import "sort"
import "fmt"
// Per compiere un sort con funzioni custom occorre un tipo
// che può essere un alias di un tipo corrente
// Una slice di stringhe
type ByLength []string
// Occorre implementare l'interfaccia sort.Interface
// per poter usare la funzione Sort
// Questa richiede la definizione delle funzioni
// Len, Swap e Less
// Len ritorna la lunghezza della stringa
func (s ByLength) Len() int {
return len(s)
}
// Swap inverte due stringhe della slice
// i e j sono gli indici
func (s ByLength) Swap(i, j int) {
// Fantastico! Il primo swap senza
// variabili d'appoggio intermedie
s[i], s[j] = s[j], s[i]
}
// Less contiene la logica
// Determina quale stringa è 'minore' ovvero viene
// prima dell'altra secondo il nostro criterio
func (s ByLength) Less(i, j int) bool {
return len(s[i]) < len(s[j])
}
func main() {
// Slice originale
fruits := []string{"peach", "banana", "kiwi"}
// Sortizzazione
sort.Sort(ByLength(fruits))
// Stampa del risultato
fmt.Println(fruits)
}