2 回答
TA贡献1847条经验 获得超11个赞
这很有趣:sort.Sort()
期望类型定义排序和一些数组操作。您可以拥有“X-sortable point list”和“Y-sortable point list”类型,但让它们共享数组操作与其他语言的工作方式不同,因为 Go 不使用继承。
我想到的第一种方法是创建XSortablePoints
和YSortablePoints
键入每个独立实现sort.Interface
的Points
实例,并将您的实例转换为您目前需要的任何实例——请参见此处:http : //play.golang.org/p/9V3WlKjOwX。
然后 nemo 有一个更好的方法:类型嵌入允许XSortablePoints
并YSortablePoints
共享数组操作的功能。此外,nemo 不会将可排序类型保存在变量中,这是有道理的,因为它们只存在于这个排序调用中。这是调整后的示例代码:http : //play.golang.org/p/wNm-ilM18n
请注意,这些方法在您投射时实际上都没有复制您的点数据,只是复制了切片标题。通过查看第一个示例打印出的指针地址,您可以看到这一点。
你可以变得更有趣:在http://play.golang.org/p/4PmJVi2_7D有一个 Points.Sort 使用任意比较函数。我认为只定义更多类型的蛮力方法就可以了,只要您只有两个或三个排序,但情况会有所不同。请注意,对于比此处的点大得多的类型,您可能希望将比较器定义为采用指针而不是值,以避免复制。
re: SORT_BY_X
: 我通常会避免在程序运行时更新全局模式设置变量,因为有很多方法可以反过来咬你。例如,也许有一天你会有两个并行的 goroutine,然后当它们同时访问全局时就会出现问题。或者,当 SORT_BY_X 的初始值为 时,某些代码可能会工作false
,然后有一天会失败,因为它是true
在另一个任务运行后留下的。如果您确实发现自己需要一个模式变量,请弄清楚您是否可以将其设为函数参数或将其附加到对象上,而不是将其设为全局变量。
最后,可能有一个包已经提供了您想要的一些更高级别的功能。例如,这里列出了一些与地理数据相关的包:https : //code.google.com/p/go-wiki/wiki/Projects#GIS
TA贡献2051条经验 获得超10个赞
除了 user2714852 的回答之外,您还可以使用与包中已用于反向排序的技术相同的技术sort:隐藏Less()定义。
虽然这与已经提出的类似,但到达那里的方式有点不同(例如在游戏中)。你定义你的点:
type Points []Point
func (points Points) Swap(i, j int) {
points[i], points[j] = points[j], points[i]
}
func (points Points) Len() int {
return len(points)
}
对于每种排序方法,您都可以实现自己的类型,该类型嵌入您的Points类型:
type XPoints struct {
Points
}
func (points XPoints) Less(i,j int) bool {
return points.Points[i].x < points.Points[j].x
}
type YPoints struct {
Points
}
func (points YPoints) Less(i, j int) bool {
return points.Points[i].y < points.Points[j].y
}
现在您可以使用不同的排序方法,如下所示:
pts := Points{{1, 2, 3}, {2, 1, 3}}
sort.Sort(XPoints{pts})
fmt.Println("X-sorted points:", pts)
sort.Sort(YPoints{pts})
fmt.Println("Y-sorted points:", pts)
- 2 回答
- 0 关注
- 264 浏览
添加回答
举报