Tri Par DES Fonctions

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.