为了账号安全,请及时绑定邮箱和手机立即绑定

按指定字段对结构切片进行排序

按指定字段对结构切片进行排序

Go
叮当猫咪 2023-05-04 16:42:48
假设我有一个SortableStruct包含 3 个字段的结构A B C,我想实现使用的函数sl []SortableStruct,orderFied string其中orderField一个是结构的字段。此函数应重新运行按 排序的切片orderField。有没有办法在没有巨大开关盒的情况下做到这一点。sort.Interface当我想按不同字段比较结构时,如何实现对我来说并不难。
查看完整描述

1 回答

?
收到一只叮咚

TA贡献1821条经验 获得超4个赞

嗯,最简单的方法是切换field类型并分配一个 SORT 函数。这是您的代码:


package main


import (

    "fmt"

    "sort"

)


type SortableStruct struct {

    A int

    B int

    C int

}


func sortStruct(arr []SortableStruct, field string) {

    var less func(i, j int) bool

    switch field {

    case "B":

        less = func(i, j int) bool {

            return arr[i].B < arr[j].B

        }

    case "C":

        less = func(i, j int) bool {

            return arr[i].C < arr[j].C

        }

    default:

        less = func(i, j int) bool {

            return arr[i].A < arr[j].A

        }

    }


    sort.Slice(arr, less)

}


func main() {

    arr := []SortableStruct{

        {

            A: 1,

            B: 5,

            C: 3,

        },

        {

            A: 2,

            B: 3,

            C: 20,

        },

        {

            A: -1,

            B: -1,

            C: 10,

        },

    }


    sortStruct(arr, "C")

    fmt.Println(arr)

}

另一个想法是定义 3 个类型,每个类型都实现接口sort.Interface


type SortableStructByA []SortableStruct

type SortableStructByB []SortableStruct

type SortableStructByC []SortableStruct

然后,您必须将切片转换为所需的类型(取决于您想要的类型)并执行如下操作:


sortableSlice := SortableStructByA(arr)

sort.Sort(sortableSlice)


查看完整回答
反对 回复 2023-05-04
  • 1 回答
  • 0 关注
  • 70 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信