Как обратить произвольный массив в го? - PullRequest
0 голосов
/ 04 июня 2018

Конечно, всегда можно написать цикл for.Но совместное использование кода обычно всегда хорошо.Так есть ли способ написать метод, который сортирует любой массив?Кроме того, производительность, так что я предполагаю, что это исключает рефлексию.

sort.Reverse, похоже, не работает.Следующее не будет компилироваться:

package main

import (
    "fmt"
    "sort"
)

type A struct {
    X int
}

func main() {
x := make([]A, 0)
x = append(x, A{1})
x = append(x, A{2})
sort.Reverse(sort.IntSlice(x))
fmt.Println(x)
}

1 Ответ

0 голосов
/ 04 июня 2018

[]A - это не фрагмент int, это фрагмент структур, и вы должны реализовать sort.Interface, чтобы описать, как его сортировать.

Вот рабочий пример:

package main

import (
    "fmt"
    "sort"
)

type A struct {
    X int
}

type ByX []A

func (a ByX) Len() int           { return len(a) }
func (a ByX) Swap(i, j int)      { a[i], a[j] = a[j], a[i] }
func (a ByX) Less(i, j int) bool { return a[i].X < a[j].X }

func main() {
    x := make([]A, 0)
    x = append(x, A{1})
    x = append(x, A{2})
    sort.Sort(sort.Reverse(ByX(x)))
    fmt.Println(x)
}

Попробуйте на игровой площадке Go .

Кроме того, вы можете позвонить sort.Slice и предоставить ему только функцию Less:

sort.Slice(x, func(i, j int) bool { return x[i].X > x[j].X })

YouСледует заметить, что функция less отличается.Поскольку мы хотим выполнить сортировку в обратном порядке и сокращение sort.Slice не совместимо с sort.Reverse, нам пришлось изменить функцию less, чтобы она возвращала противоположное (> вместо <).

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...