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

如何使用多个排序参数对结构进行排序?

如何使用多个排序参数对结构进行排序?

Go
猛跑小猪 2021-12-27 15:11:28
我有一个成员数组/切片:type Member struct {    Id int    LastName string    FirstName string}var members []Member我的问题是如何对它们进行排序LastName,然后由FirstName.
查看完整描述

3 回答

?
GCT1015

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

使用sort.Slice(自 Go 1.8 起可用)或sort.Sort函数对值的切片进行排序。


通过这两个函数,应用程序提供了一个函数来测试一个切片元素是否小于另一个切片元素。要先按姓氏再按名字排序,请先比较姓氏然后是名字:


if members[i].LastName < members[j].LastName {

    return true

}

if members[i].LastName > members[j].LastName {

    return false

}

return members[i].FirstName < members[j].FirstName

使用带有 sort.Slice 的匿名函数指定 less 函数:


var members []Member

sort.Slice(members, func(i, j int) bool {

    if members[i].LastName < members[j].LastName {

        return true

    }

    if members[i].LastName > members[j].LastName {

        return false

    }

    return members[i].FirstName < members[j].FirstName

})

less 函数是通过带有 sort.Sort 函数的接口指定的:


type byLastFirst []Member


func (members byLastFirst) Len() int           { return len(members) }

func (members byLastFirst) Swap(i, j int)      { members[i], members[j] = members[j], members[i] }

func (members byLastFirst) Less(i, j int) bool { 

    if members[i].LastName < members[j].LastName {

       return true

    }

    if members[i].LastName > members[j].LastName {

       return false

    }

    return members[i].FirstName < members[j].FirstName

}


sort.Sort(byLastFirst(members))

除非性能分析表明排序是一个热点,否则请使用对您的应用程序最方便的函数。


查看完整回答
反对 回复 2021-12-27
?
江户川乱折腾

TA贡献1851条经验 获得超5个赞

sort.Slice像这样使用较新的函数:


sort.Slice(members, func(i, j int) bool {

    switch strings.Compare(members[i].FirstName, members[j].FirstName) {

    case -1:

        return true

    case 1:

        return false

    }

    return members[i].LastName > members[j].LastName

})

或类似的东西。


查看完整回答
反对 回复 2021-12-27
?
12345678_0001

TA贡献1802条经验 获得超5个赞

另一种模式,我觉得它稍微干净一点:


if members[i].LastName != members[j].LastName {

    return members[i].LastName < members[j].LastName

}


return members[i].FirstName < members[j].FirstName


查看完整回答
反对 回复 2021-12-27
  • 3 回答
  • 0 关注
  • 173 浏览
慕课专栏
更多

添加回答

举报

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