У меня возникли проблемы с сортировкой строк по символу (чтобы проверить, являются ли две строки анаграммами, я хочу их отсортировать и проверить на равенство).
Я могу получить представление []rune
строки s
следующим образом:
runes := make([]rune, len(s))
copy(runes, []rune(s))
И я могу сортировать такие как
someInts := []int{5, 2, 6, 3, 1, 4} // unsorted
sort.Ints(someInts)
Но rune
является просто псевдонимом для int32
, поэтому я должен иметь возможность вызывать
sort.Ints(runes)
Однако я получаю сообщение об ошибке:
cannot use runes (type []rune) as type []int in function argument
Итак... как мне отсортировать фрагмент int32, int64 или int *?
РЕДАКТИРОВАТЬ: мои руны отсортированы, но мальчик, это уродливо.
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)
}
Итак, в основном, если у вас есть кусочек чего-либо, вам придется обернуть его типом, который реализует sort.Interface
. Все эти реализации будут иметь те же самые тела методов (например, sort.IntSlice
и sort.Float64Slice
). Если это действительно так уродливо, это должно быть тогда, почему они не предоставили эти обертки WhateverSlice в пакете sort
? Отсутствие дженериков начинает сильно болеть сейчас. Должен быть лучший способ сортировки вещей.