Mam problem z sortowaniem ciągów znaków według znaków (aby sprawdzić, czy dwa ciągi są anagramami, chcę je posortować i sprawdzić równość).Czy sortujesz kawałki run?
mogę uzyskać []rune
reprezentację ciąg s
tak:
runes := make([]rune, len(s))
copy(runes, []rune(s))
I mogę posortować ints jak to
someInts := []int{5, 2, 6, 3, 1, 4} // unsorted
sort.Ints(someInts)
Ale rune
tylko aliasem int32
więc powinienem być można zadzwonić pod numer
sort.Ints(runes)
Jednakże pojawia się błąd:
cannot use runes (type []rune) as type []int in function argument
Więc ... Jak sortować plasterek Int32, Int64 lub int *?
EDIT: Zrobiłem moje runy posortowane, ale chłopcze, to jest brzydkie.
type RuneSlice []rune
func (p RuneSlice) Len() int { return len(p) }
func (p RuneSlice) Less(i, j int) bool { return p[i] < p[j] }
func (p RuneSlice) Swap(i, j int) { p[i], p[j] = p[j], p[i] }
func sorted(s string) string {
runes := []rune(s)
sort.Sort(RuneSlice(runes))
return string(runes)
}
Więc w zasadzie, jeśli masz kawałek cokolwiek, trzeba zawinąć go w typie, który implementuje sort.Interface
. Wszystkie te implementacje będą miały dokładnie takie same ciała metod (jak sort.IntSlice
i sort.Float64Slice
). Jeśli tak naprawdę to musi być brzydkie, dlaczego nie dostarczyły one owijaczy WhateverSlice w pakiecie sort
? Brak leków generycznych zaczyna teraz bardzo mocno boleć. Musi istnieć lepszy sposób sortowania rzeczy.
Tak, to jest przerażające naruszenie suche. Chodzi o to, że posiadanie tego samego kodu powielanego tyle razy, ile jest podstawowych typów, jest całkiem złe. Ogólne algorytmy sortowania, które działają na podstawowych typach bez dodatkowych ściegów, są prawie takie, jakich można się spodziewać w KAŻDYM języku. Ale nauczenie kompilatora, jak uzyskać 20-krotny odcinek, jest po prostu nierealne. – andras
Tęsknisz za tym punktem. Ogólny algorytm sortowania działa nie tylko dla wycinków, ale dla _okolwiek_ spełniających 'sort.Interface'. Teraz, w jaki sposób proponuje się automagicznie uzyskać 'Len' i przyjaciół z _nie_ rzeczy_, o których nie wiesz nic wcześniej (podczas kompilacji) ??? IOW, twój rant nie jest racjonalny. – zzzz
Nie oczekuję, że kompilator będzie mógł sortować instancje "BucketOfFish" po wyjęciu z pudełka. "sort.Interface" wydaje się być ładną abstrakcją dla tych przypadków (chociaż prawdopodobnie chcę zachować moje ryby również w plasterkach, zamiast jakiegoś niestandardowego kontenera). Po prostu dziwne, że taki podstawowy przypadek użycia (kawałek podstawowego typu) nie jest objęty standardową biblioteką. – andras