为了账号安全,请及时绑定邮箱和手机立即绑定

在golang中排序int切片

在golang中排序int切片

Go
Qyouu 2021-04-09 15:15:09
说我有一个包含以下数字的整数切片:2781,4706,1347,1192,3087,2920,198,2312,930,3284,1677,3687,2011,4107,4148,4195,2159,1263,2918,2503我想根据它们离某个值的距离有多近对它们进行排序。例如,假设我的值是1200。我的切片经过排序后将是:1192,1263,1347,1677,2011,2159,2312,2503,2781,2918,2920,3087,3284,3687,4107,4148,4195,4706,930,198我尝试了以下方法:遍历数组,减去指定的值,然后以升序排序,最终再次添加该值以返回到我的原始编号。这种方法并非在所有测试用例中都有效,而且由于对数组进行了变异,因此我知道它的坏习惯。
查看完整描述

1 回答

?
繁星点点滴滴

TA贡献1803条经验 获得超3个赞

一种方法是sort.Slice(...)与“较少”(比较器)函数一起使用,该函数仅返回两个给定值与目标值之间较小的距离。


例如(Go Playground):


func main() {

  xs := []int{2781, 4706, 1347, 1192, 3087, 2920, 198, 2312, 930, 3284, 1677, 3687, 2011, 4107, 4148, 4195, 2159, 1263, 2918, 2503}

  sortByDistanceFrom(1200, xs)

  fmt.Println(xs)

  // [1192 1263 1347 930 1677 2011 2159 198 2312 2503 2781 2918 2920 3087 3284 3687 4107 4148 4195 4706]


}


func sortByDistanceFrom(x int, xs []int) {

  sort.Slice(xs, func(i, j int) bool {

    di := math.Abs(float64(x - xs[i]))

    dj := math.Abs(float64(x - xs[j]))

    return di < dj

  })

}

请注意,此示例返回的第四个值是930,而不是示例输出产生的1677,因为它计算了到目标数字(|1200-1677|=433 > |1200-930|=270)的绝对距离。如果您希望大于目标值而不是小于目标值,则必须相应地修改比较器功能。


查看完整回答
反对 回复 2021-04-19
  • 1 回答
  • 0 关注
  • 388 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信