我有一个 Points 类型的多维点列表。
我已经实施了sort.Sort
界面,现在可以排序y value
.
e.g.
type Points []*Point
func (points Points) Len() int {
return len(points)
}
func (points Points) Less(i, j int) bool {
return points[i].y < points[j].y
}
func (points Points) Swap(i, j int) {
points[i], points[j] = points[j], points[i]
}
type Point struct {
x int
y int
country_id int
}
现在我想按以下方式对我的观点进行排序x value
代替y value
.
我的想法是使用带有全局标志的 if 语句(可以在排序之前打开或关闭):
func (points Points) Less(i, j int) bool {
if SORT_BY_X {
return points[i].x < points[j].x
}
return points[i].y < points[j].y
}
有更好的方法吗?我应该多次实施 Less 吗?例如,如果我按列对数据表进行排序怎么办?
啊,这很有趣:sort.Sort()
期望类型定义排序和一些数组操作。您可以拥有“X-可排序点列表”和“Y-可排序点列表”类型,但让它们共享数组操作的方式与其他语言不同,因为 Go 不使用继承。
我想到的第一个方法是创建XSortablePoints
and YSortablePoints
每个独立实现的类型sort.Interface
,并转换你的Points
实例到您目前需要的任何一个 - 请参阅此处:http://play.golang.org/p/9V3WlKjOwX http://play.golang.org/p/9V3WlKjOwX.
然后nemo有一个更好的方法:类型嵌入允许XSortablePoints
and YSortablePoints
共享数组操作的函数。此外,nemo 不会将可排序类型保存在变量中,这是有道理的,因为它们仅针对这一排序调用而存在。这是调整后的示例代码:http://play.golang.org/p/wNm-ilM18n http://play.golang.org/p/wNm-ilM18n
请注意,这些方法都不会在您投射时实际复制点数据,而只是复制切片标题。通过查看第一个示例打印的指针地址,您可以看到这一点。
你可以变得更奇特:有一个 Points.Sort 采用任意比较函数http://play.golang.org/p/4PmJVi2_7D http://play.golang.org/p/4PmJVi2_7D。我认为只要只有两个或三个排序,定义更多类型的蛮力方法就可以了,但情况会有所不同。请注意,对于比此处的点大得多的类型,您可能需要定义比较器以采用指针而不是值,以避免复制。
re: SORT_BY_X
:我通常会避免在程序运行时更新全局模式设置变量,因为这些变量可能会以多种方式反过来影响您。例如,也许有一天你会有两个并行的 goroutine,然后当它们同时访问全局时就会出现问题。或者当 SORT_BY_X 的初始值为false
,然后有一天失败,因为它被留下了true
另一个任务运行后。如果您确实需要一个模式变量,请弄清楚是否可以将其设为函数参数或将其附加到对象,而不是全局变量。
最后,可能有一个包已经提供了您想要的一些高级功能。例如,这里列出了一些与地理数据相关的包:https://code.google.com/p/go-wiki/wiki/Projects#GIS https://code.google.com/p/go-wiki/wiki/Projects#GIS
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)