Как отсортировать структуру по произвольному полю? Всем привет
Есть структура 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
223 +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 Апр в 13:18
Не можешь разобраться в этой теме?
Обратись за помощью к экспертам
Название заказа не должно быть пустым
Введите email
Бесплатные доработки
Гарантированные бесплатные доработки
Быстрое выполнение
Быстрое выполнение от 2 часов
Проверка работы
Проверка работы на плагиат
Интересные статьи из справочника
Поможем написать учебную работу
Название заказа не должно быть пустым
Введите email
Доверьте свою работу экспертам
Разместите заказ
Наша система отправит ваш заказ на оценку 84 727 авторам
Первые отклики появятся уже в течение 10 минут
Прямой эфир