Le Go par l'exemple: Tri par des fonctions

Parfois on veut trier une collection selon un autre critère que l’ordre naturel. Par exemple, imaginons que l’on veuille trier des chaines par leur longueur plutôt que par ordre alphabétique. Voici un exemple de tri sur mesure en Go.

package main
import "sort"
import "fmt"

Afin de trier selon une méthode custom en Go, nous avons besoin d’un type correspondant. Ici, on crée le type ByLength, qui est simplement un alias pour le type []string builtin.

type ByLength []string

Nous implémentons sort.Interface - Len, Less, et Swap - sur notre type, afin de pouvoir utiliser la fonction générique Sort du package sort. Len et Swap seront généralement similaires à travers les types, et Less va implémenter la logique de notre méthode de tri. Dans notre cas, nous voulons trier par ordre de longueur de chaine croissante, donc on utilise len(s[i]) et len(s[j]) ici.

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

Avec tout ceci en place, nous pouvons maintenant implémenter notre tri sur mesure en convertissant la slice de départ fruits en ByLength, et ensuite utiliser la méthode sort.Sort sur cette slice typée.

func main() {
    fruits := []string{"peach", "banana", "kiwi"}
    sort.Sort(ByLength(fruits))
    fmt.Println(fruits)
}

Faire tourner notre programme montre une liste triée par longueur de chaîne, comme désiré.

$ go run sorting-by-functions.go 
[kiwi peach banana]

En suivant ce modèle, qui consiste à créer un type custom, implémenter les trois méthodes de l’interface sur ce type, et ensuite appeler sort.Sort sur une collection de ce type custom, nous pouvons trier des slices selon n’importe quelle manière.

Exemple suivant: Panic.