Go Academy · Lektion

Brugerdefinerede sorteringsrækkefølger

Definér sammenligningsfunktioner

Lektion 2 af 413 trin

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-funktion
  • sort.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.Reverse vender rækkefølgen, og sort.Interface giver genanvendelige typer
Gratis at komme i gang

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

  1. Sortering af slices
  2. Brugerdefinerede sorteringsrækkefølger
  3. Søgning i sorterede data
  4. Stabil sortering
← Tilbage til Go Academy