@linesb

Как сортировать в Go?

Предположим у меня есть срез из byte-ов. Как его сортировать в Go?
arr := []byte{4, 3, 2, 1, 6, 3, 77, 8,3}
sort.Slice(arr, func(i, j int) bool {
	return arr[i] < arr[j]
})
fmt.Println(arr)

Это единственный способ?
Можно ли обявить функцию сравнения 1 раз и переиспользовать если придется сравнить несколько срезов?
  • Вопрос задан
  • 192 просмотра
Решения вопроса 2
EvgenyMamonov
@EvgenyMamonov Куратор тега Go
Senior software developer, system architect
Если нужна именно функция - можно вот так
func SortBytes(arr []byte) {
    sort.Slice(arr, func(i, j int) bool {
        return arr[i] < arr[j]
    })
}
// потом использовать вот так
arr := []byte{4, 3, 2, 1, 6, 3, 77, 8,3}
sortBytes(arr)
fmt.Println(arr)

Но я бы использовал тот вариант, который у вас )
sort.Slice(arr, func(i, j int) bool {
  return arr[i] < arr[j]
})
fmt.Println(arr)
Ответ написан
Способ 1: как вы и хотите, переиспользование функции. Пишем функцию, которая возвращает функцию less
https://play.golang.org/p/x_zDfZfwm_Q
func main() {
	arr := []byte{4, 3, 2, 1, 6, 3, 77, 8, 3}
	sort.Slice(arr, bytesAsc(arr))
	fmt.Println(arr)
}

func bytesAsc(arr []byte) func(i, j int) bool {
	return func(i, j int) bool {
		return arr[i] < arr[j]
	}
}


Способ 2: создаем алиас типа, у которого прописаны нужные методы.
https://play.golang.org/p/ZNkOt_jSUbr
func main() {
	arr := []byte{4, 3, 2, 1, 6, 3, 77, 8, 3}
	sort.Sort(BytesAsc(arr))
	fmt.Println(arr)
}

type BytesAsc []byte

func (a BytesAsc) Len() int           { return len(a) }
func (a BytesAsc) Swap(i, j int)      { a[i], a[j] = a[j], a[i] }
func (a BytesAsc) Less(i, j int) bool { return a[i] < a[j] }
Ответ написан
Комментировать
Пригласить эксперта
Ответы на вопрос 1
sorter := func(i, j int) bool {
		return arr[i] < arr[j]
	}
	sort.Slice(arr, sorter)
Ответ написан
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы