Brugerdefinerede sorteringsrækkefølger
Definér sammenligningsfunktioner
Brugerdefinerede sorteringsrækkefølger er en gratis Go Academy-lektion på CoddyKit. Dette er lektion 2 af 4. Du kan læse alle 3 lektioner i dette læringsspor gratis i deres fulde længde — derefter låser CoddyKit PRO alle lektioner op samt praktiske øvelser med en indbygget kodeeditor og en AI-underviser døgnet rundt. Den er en del af læringsforløbet i Go Academy, og dine fremskridt synkroniseres på tværs af nettet og CoddyKit-appen. Go Academy-kurset indeholder 4 lektioner i alt.
Ud over standardrækkefølgen
Standardsortering foregår i stigende rækkefølge. Men virkelige data kræver brugerdefinerede regler: Du kan sortere efter længde, efter flere felter eller efter en beregnet værdi.
Sammenligningsfunktionen er stedet, hvor du udtrykker den regel, du ønsker.
Less-funktionen
En sammenligningsfunktion til sort.Slice har signaturen func(i, j int) bool. Den returnerer true, når element i skal stå før element 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)
}Sortér efter strenglængde
I stedet for alfabetisk rækkefølge kan du sammenligne len() for hver streng og sortere efter længde.
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)
}Sortér structs efter felt
Vælg et hvilket som helst felt i en struct til sammenligningen. Her sorterer vi produkter efter pris.
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)
}Sortering efter flere felter
Hvis du vil afgøre rækkefølgen ved ens værdier, skal du sammenligne et andet felt, når det første er ens. Sortér efter alder og derefter efter navn.
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)
}Vend rækkefølgen med sort.Reverse
sort.Reverse omslutter en sort.Interface for at vende dens rækkefølge. Den kan bruges sammen med hjælpefunktioner som 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)
}sort.Interface
Hvis du vil have fuld kontrol, skal du implementere sort.Interface: de tre metoder Len(), Less(i, j int) bool og 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)
}Sortering efter beregnet værdi
Sammenligningen kan bruge et hvilket som helst udtryk. Sortér tal efter deres absolutte afstand fra nul.
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)
}Sortering uden forskel på store og små bogstaver
Brug strings.ToLower inde i sammenligningen for at ignorere forskelle på store og små bogstaver, når strenge sorteres.
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 eller interface
Der er to måder at tilpasse rækkefølgen på:
sort.Slice– en hurtig, indlejret less-funktionsort.Interface– en genanvendelig navngiven type med tre metoder
Foretræk sort.Slice til sorteringer, der kun udføres én gang.
Hold sammenligninger uden bivirkninger
En sammenligningsfunktion bør kun læse elementer og returnere en boolsk værdi. Den må ikke ændre slicen eller have bivirkninger, ellers kan sorteringen opføre sig uforudsigeligt.
Hurtigt tjek
Du vil sortere personer efter alder og efter navn, når aldrene er ens. Hvilken teknik bruger du?
Opsummering
Du kan definere enhver sorteringsrækkefølge:
- Less-funktionen udtrykker din regel
- Sortering efter flere felter sammenligner et andet felt, når værdierne er ens
sort.Reversevender rækkefølgen, ogsort.Interfacegiver genanvendelige typer
Lær Go med en AI-underviser — gratis
Skriv og kør rigtig kode i din browser, få øjeblikkelig hjælp fra en AI-underviser døgnet rundt, og fortsæt, hvor du slap, på web eller i appen.
- Kurser
- 51
- Lektioner
- 203
Ofte stillede spørgsmål
Er lektionen “Brugerdefinerede sorteringsrækkefølger” gratis?
Ja — alle 3 lektioner i læringssporet Go Academy, inklusive “Brugerdefinerede sorteringsrækkefølger”, kan læses gratis i deres fulde længde her på webstedet. Derefter låser CoddyKit PRO alle lektioner op samt interaktive øvelser med en indbygget kodeeditor og en AI-underviser døgnet rundt. Go Academy-kurset indeholder 4 lektioner i alt.
Hvad lærer jeg i “Brugerdefinerede sorteringsrækkefølger”?
Definér sammenligningsfunktioner Du øver dig i Go Academy med praktisk kode, som du kører direkte i browseren, og en AI-vejleder døgnet rundt besvarer dine spørgsmål, mens du arbejder dig gennem lektionen.
Skal jeg have erfaring for at begynde på Go Academy?
Der kræves ingen tidligere erfaring. Go Academy på CoddyKit er tilrettelagt for både begyndere og øvede, så du kan starte her eller fra begyndelsen og lære i dit eget tempo. Dette er lektion 2 af 4.
Hvor lang tid tager lektionen “Brugerdefinerede sorteringsrækkefølger”?
De fleste CoddyKit-lektioner tager cirka 5–10 minutter. Hver lektion er kort og interaktiv, så du gør løbende fremskridt og kan fortsætte, hvor du slap – på både web og app.
Kan jeg skrive og køre kode i denne Go Academy-lektion?
Ja. Alle Go Academy-lektioner har en indbygget kodeeditor, så du kan skrive og køre rigtig kode direkte i din browser og få øjeblikkelig feedback fra AI – uden lokal opsætning.
Alle lektioner i dette kursus
- Sortering af slices
- Brugerdefinerede sorteringsrækkefølger
- Søgning i sorterede data
- Stabil sortering