go lang中按不同维度对点(结构)进行排序

2024-01-30

我有一个 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(使用前将#替换为@)

go lang中按不同维度对点(结构)进行排序 的相关文章

  • Python:如何对数组 X 进行排序,但对 Y 进行相同的相对排序?

    例如 X 5 6 2 3 1 Y 7 2 3 4 6 我对X进行排序 X 1 2 3 5 6 但我希望对 Y 应用相同的相对排序 以便数字保持与以前相同的相对位置 Y 6 3 4 7 2 我希望这是有道理的 通常 你会做一个zip sort
  • 为什么奇数的切片容量与偶数的切片行为不同

    我注意到 当容量为奇数时 切片的容量会以不同的方式表现 更具体地说 当向切片添加元素时 切片的容量为doubled当原始容量为偶数时 但当原容量为奇数时 容量为增加一 然后加倍 例子 s make int 28 28 s append s
  • 为什么结构中“[0]byte”的位置很重要?

    0 byte在golang中不应该占用任何内存空间 但这两个结构体的大小不同 type bar2 struct A int 0 byte type bar3 struct 0 byte A int 那么为什么这个位置 0 byte这里重要吗
  • 是否可以获取有关 Golang 中调用者函数的信息?

    是否可以获取有关 Golang 中调用者函数的信息 例如 如果我有 func foo Do something func main foo 我怎样才能得到那个foo已被呼叫来自main 我可以用其他语言实现这一点 例如在 C 中我只需要使用
  • 如何解析 Content-Disposition 标头以检索文件名属性?

    使用 go 如何解析从 http HEAD 请求检索到的 Content Disposition 标头以获取文件的文件名 此外 如何从 http HEAD 响应中检索标头本身 这样的事情正确吗 resp err http Head http
  • 在 MongoDB 中,如何根据嵌入对象中的属性对文档进行排序?

    在我的产品集合中 我可以找到已在 GB 地区发布的所有产品 gt db products find release region GB pretty id foo release region GB date ISODate 2012 03
  • GOPATH值设置

    我用go1 3 1 windows amd64 msi安装go 安装后GOROOT是默认设置 我发现 D Programs Go bin 在 PATH 中 然后我创建一个 GOPATH 环境变量 使用 go get 命令时 出现错误 软件包
  • 按偶数和奇数排序

    我想知道是否可以使用 std sort 函数按偶数或奇数对数字进行排序 我有以下代码 但我不确定如何在 std sort 中实现 inline bool isEven const Point n return n getX 2 0 它是否正
  • 使用 HTTPS GRC 从 AWS Codecommit 获取私有存储库

    我正在尝试导入位于 AWS codecommit 中的模块 为了克隆存储库 我使用 HTTPS GRC Git 远程代码提交 方法 该方法使用 Google Suite 凭证来访问 AWS 控制台 我用来克隆存储库的命令是 git clon
  • 如何使用 JQuery DataTables 根据每个单元格中值的子字符串对列进行排序

    假设我有一列包含格式为 P 的对象标识符 例如 P12 3767 我使用的是 1 9 1 版本的 JQuery数据表插件 http datatables net用于排序和分页 有没有办法可以忽略单元格值的前 4 个字符 P12 部分 以便我
  • 对 os.listdir 文件进行排序 Python

    如果已下载数年的数据 这些数据存储在具有以下命名约定的文件中 year day dat 例如 名为 2014 1 dat 的文件包含 2014 年 1 月 1 日的数据 我需要按天排序读取这些数据文件 2014 1 dat 2014 2 d
  • GoLang ssh:尽管将其设置为 nil,但仍出现“必须指定 HosKeyCallback”错误

    我正在尝试使用 GoLang 连接到远程服务器 在客户端配置中 除了用户和密码之外 我将 HostKeyCallback 设置为 nil 以便它接受每个主机 config ssh ClientConfig User user HostKey
  • 直接选择排序与交换选择排序

    有什么区别直接选择排序 vs 交换选择排序 今天我陷入了一场争论 我的教授在他的讲义中使用了这两个术语 维基百科和任何教科书或网站都会为您提供的选择排序就是他所说的 交换选择排序 我以前从未听说过 交换选择排序 这个术语 仅 选择排序 并且
  • 为什么我不能将左大括号放在下一行?

    当我尝试编译以下代码时遇到奇怪的错误 package main import fmt fmt func main var arr 3 int for i 0 i lt 3 i fmt Printf d arr i 错误如下 unexpect
  • go中有memset的类似物吗?

    在 C 中 我可以使用某些值初始化数组memset https msdn microsoft com en us library aa246471 28v vs 60 29 aspx const int MAX 1000000 int is
  • 以下 PLINQ 代码没有改进

    我没有看到使用以下代码的处理速度有任何改进 IEnumerable
  • 维护/更新mysql中的记录顺序

    我在 mySql 中有一个记录表 我需要按照用户指定的方式维护它们的订单 所以我添加了一个 位置 列 当我移动特定记录时更新所有记录的 SQL 语句是什么 我有类似的东西 UPDATE items SET position 2 WHERE
  • 如何在 Linux 中编写文本模式 GUI? [关闭]

    Closed 这个问题正在寻求书籍 工具 软件库等的推荐 不满足堆栈溢出指南 help closed questions 目前不接受答案 当我编写脚本 程序时 我经常想弹出一个简单的文本 gui 来提示输入 我该怎么做 例如 来自 Shel
  • 负整数的基数排序

    我正在尝试对整数 包括负整数 实现基数排序 对于非负整数 我计划为数字0 9创建一个10个队列的队列 并实现LSD算法 但我对负整数有点困惑 我现在的想法是继续为它们创建另一个包含 10 个队列的队列 并分别对它们进行排序 然后在最后 我将
  • 根据 Pandas 中的列表对多列进行排序

    感谢有关如何根据 pandas 中的倍数列表对给定多列进行排序的任何提示 如下所示 import pandas as pd sort a a d e sort b s1 s3 s6 sort c t1 t2 t3 df pd DataFra

随机推荐