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)


...全文
796 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官方实例
内容概要:本文介绍了一种基于多目标粒子群算法(MOPSO)的微电网优化调度模型,综合考虑风能、光伏、储能系统、柴油发电机、燃气轮机以及与主电网之间的能量交互等多种分布式能源的协同运行。通过构建以运行成本最小化、碳排放最低化和系统可靠性最优化为目标的多目标优化模型,利用Matlab平台实现MOPSO算法求解,完成对微电网在不同运行场景下的能量管理与调度方案优化。该模型能够有效平衡经济性与环保性之间的关系,适用于含多类型分布式电源的复杂微电网系统,具有较强的工程应用价值和科研参考意义; 适合人群:具备一定电力系统基础知识和Matlab编程能力的研究生、科研人员及工程技术人员,尤其适合从事微电网、智能电网、综合能源系统、可再生能源集成与优化调度等领域研究的专业人士; 使用场景及目标:①用于多能源耦合微电网系统的协同优化调度研究;②支持多目标智能优化算法在能源系统中的建模与求解实践,帮助用户掌握MOPSO在实际工程问题中的应用方法;③为学术论文复现、毕业设计、科研项目开发提供完整的代码实例与技术支撑; 阅读建议:建议读者结合Matlab代码与理论文档,深入理解目标函数构建、约束条件处理及Pareto最优解集生成机制,重点关注算法参数设置、多目标权衡分析与结果可视化,并可通过调整能源配置或引入新约束进行二次开发与创新研究。

2,352

社区成员

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

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