GO语言结构体排序

liutengfeigo 2013-12-18 04:15:03
跟C/C++的感觉差不多.
对应的切片实现sort的这3个接口Len, Less, Swap.就好了.


import "sort"

type user struct {
id int
name string
}

type users []user

func (u users) Len() int {
return len(u)
}

func (u users) Less(i, j int) bool {
if u[i].id == u[j].id {
return u[i].name < u[j].name
}
return u[i].id < u[j].id//sort by id if id is the same sort by name...
}

func (u users) Swap(i ,j int) {
u[i].id, u[j].id = u[j].id, u[i].id
u[i].name, u[j].name = u[j].name, u[i].name
}


uu := []user{{1,"aa"}, {20,"bb"}, {3, "cc"}, {3, "cb"}}
fmt.Println(uu)
sort.Sort(users(uu))
fmt.Println(uu)


...全文
755 9 打赏 收藏 转发到动态 举报
写回复
用AI写文章
9 条回复
切换为时间正序
请发表友善的回复…
发表回复
飃颻 2014-05-12
  • 打赏
  • 举报
回复
ByAge做为sort接口的类型,必须依次实现Len,Less和Swap方法,否则运行时报sort接口函数参数错误,而Person为自定义的待排序结构体。 一、func (p Person) String() string { return fmt.Sprintf("%s: %d\n", p.Name, p.Age) p Person无指针类型的运行结果: >go run mysort.go [Bob: 31 John: 42 Michael: 17 Jenny: 26 ] [Michael: 17 Jenny: 26 Bob: 31 John: 42 ] 二、func (p *Person) String() string { return fmt.Sprintf("%s: %d\n", p.Name, p.Age) p *Person指针类型的运行结果: >go run mysort.go [{Bob 31} {John 42} {Michael 17} {Jenny 26}] [{Michael 17} {Jenny 26} {Bob 31} {John 42}]
青空飞羽 2014-05-09
  • 打赏
  • 举报
回复
成员函数的写法是不是有问题啊? 该这样? func (p *Person) String() string { return fmt.Sprintf("%s: %d", p.Name, p.Age) }
ForNoReason 2014-05-07
  • 打赏
  • 举报
回复
go 的结构体数组排序还是相当原始的, 怀念C#的排序.
十一文 2014-01-22
  • 打赏
  • 举报
回复
引用 5 楼 u011745918 的回复:
太强大了,爱死GO
欢迎多来 发表资源
oracleri 2014-01-20
  • 打赏
  • 举报
回复
太强大了,爱死GO
末日哥 2013-12-23
  • 打赏
  • 举报
回复
学习
十一文 2013-12-18
  • 打赏
  • 举报
回复
强烈支持 楼主
liutengfeigo 2013-12-18
  • 打赏
  • 举报
回复
自己连swap都写不好了.
liutengfeigo 2013-12-18
  • 打赏
  • 举报
回复

package main

import (
	"fmt"
	"sort"
)

type Person struct {
	Name string
	Age  int
}

func (p Person) String() string {
	return fmt.Sprintf("%s: %d", p.Name, p.Age)
}

// ByAge implements sort.Interface for []Person based on
// the Age field.
type ByAge []Person

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

func main() {
	people := []Person{
		{"Bob", 31},
		{"John", 42},
		{"Michael", 17},
		{"Jenny", 26},
	}

	fmt.Println(people)
	sort.Sort(ByAge(people))
	fmt.Println(people)

}
golang官方实例

2,351

社区成员

发帖
与我相关
我的任务
社区描述
go语言学习与交流版
社区管理员
  • go语言社区
  • 俺叫西西弗斯
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧