Как отсортировать структуру по произвольному полю? Всем привет
Есть структура type bla-bla struct {
a float64
b float64
c float64
d float64
}
и есть массив таких структур:func main {
var la []bla-bla
var la-la bla-bla
struct1 := la-la{a: 1.0, b: 3.0, c:3.0, d:1.0}
struct2 := la-la{a: 0.0, b: 5.0, c:3.0, d:2.0}
struct3 := la-la{a: 8.0, b: 1.0, c:4.0, d:11.0}
struct4 := la-la{a: 2.0, b: 0.0, c:3.0, d:7.0}
la = append(la, struct1)
la = append(la, struct2)
la = append(la, struct3)
la = append(la, struct4)
}
как можно их сортировать по нужному мне полю?
то есть нужна функция вида:func sort_structs(la-la []Queries, sort_field) {
//some_code
}
к примеру, один раз нужно отсортировать ее по полю a. Другой раз по полю c. И так далее
сама функция была написана но для [](map[string]interface{}). Сортирую значения, потом возвращаю соответствующие ключи. Перенес эту функцию на работу со структурой, но беда в том, что не знаю как задавать произвольное поле для сортировки.
Если кто сталкивался или знает, подскажите плз

21 Авг 2019 в 06:27
262 +1
0
Ответы
1

Для сортировки структуры по произвольному полю вы можете использовать интерфейсы и функцию sort.Sort() из стандартной библиотеки Go. Вот пример кода, который показывает как это можно сделать:

package main
import (
"fmt"
"sort"
)
type blaBla struct {
a float64
b float64
c float64
d float64
}
type ByField struct {
structs []blaBla
less func(i, j int) bool
}
func (b ByField) Len() int { return len(b.structs) }
func (b ByField) Swap(i, j int) { b.structs[i], b.structs[j] = b.structs[j], b.structs[i] }
func (b ByField) Less(i, j int) bool { return b.less(i, j) }
func sortStructs(la []blaBla, sortField string) {
switch sortField {
case "a":
sort.Slice(ByField{structs: la, less: func(i, j int) bool { return la[i].a < la[j].a }}, func(i, j int) { la[i], la[j] = la[j], la[i] })
case "b":
sort.Slice(ByField{structs: la, less: func(i, j int) bool { return la[i].b < la[j].b }}, func(i, j int) { la[i], la[j] = la[j], la[i] })
case "c":
sort.Slice(ByField{structs: la, less: func(i, j int) bool { return la[i].c < la[j].c }}, func(i, j int) { la[i], la[j] = la[j], la[i] })
case "d":
sort.Slice(ByField{structs: la, less: func(i, j int) bool { return la[i].d < la[j].d }}, func(i, j int) { la[i], la[j] = la[j], la[i] })
}
}
func main() {
var la []blaBla
var struct1 blaBla = blaBla{a: 1.0, b: 3.0, c: 3.0, d: 1.0}
var struct2 blaBla = blaBla{a: 0.0, b: 5.0, c: 3.0, d: 2.0}
var struct3 blaBla = blaBla{a: 8.0, b: 1.0, c: 4.0, d: 11.0}
var struct4 blaBla = blaBla{a: 2.0, b: 0.0, c: 3.0, d: 7.0}
la = append(la, struct1)
la = append(la, struct2)
la = append(la, struct3)
la = append(la, struct4)
fmt.Println("Before sorting:")
fmt.Println(la)
sortStructs(la, "a") // Сортировка по полю "a"
fmt.Println("After sorting:")
fmt.Println(la)
}

В данном примере функция sortStructs() принимает на вход слайс структур и поле, по которому необходимо отсортировать структуры. В зависимости от переданного поля, функция использует метод sort.Slice() для сортировки структур.

Теперь у вас должна правильно отсортироваться структура по нужному полю. Надеюсь, это поможет вам с вашей задачей! Если у вас возникнут дополнительные вопросы, не стесняйтесь спрашивать.

20 Апр 2024 в 13:18
Не можешь разобраться в этой теме?
Обратись за помощью к экспертам
Гарантированные бесплатные доработки в течение 1 года
Быстрое выполнение от 2 часов
Проверка работы на плагиат
Поможем написать учебную работу
Прямой эфир