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.Interfaceche richiede la definizione delle funzioni:

  • Len - lunghezza dell'oggetto da sortizzare
  • Swap - come invertire nell'ordine due oggetti da sortizzare
  • Less - 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)
}