Sorting golang中的整型切片排序

Sorting golang中的整型切片排序,sorting,go,slice,Sorting,Go,Slice,假设我有一个包含以下数字的整数片:2781470613471192308729201982312930328416773687201141074148419521591126329182503 我想根据它们离某个值的距离对它们进行排序。 例如,假设我的值是1200 排序后我的切片是:119212631347167720112159231225032781291829203087328436874107414841954706930198 我尝试了迭代数组的方法,减去我指定的值,然后按升序排序,最

假设我有一个包含以下数字的整数片:2781470613471192308729201982312930328416773687201141074148419521591126329182503

我想根据它们离某个值的距离对它们进行排序。 例如,假设我的值是1200

排序后我的切片是:119212631347167720112159231225032781291829203087328436874107414841954706930198


我尝试了迭代数组的方法,减去我指定的值,然后按升序排序,最后再次添加值以返回到我的原始数字。这种方法不适用于所有测试用例,我知道这是一种不好的做法,因为我正在改变数组。

一种方法是使用一个“less”(comparator)函数,该函数只返回两个给定值与目标值之间的较小距离

例如():

func main(){
xs:=[]整数{2781470613471192,3087,29201982312930930328416773687261982014107414841952159212632903}
sortByDistanceFrom(1200,xs)
格式打印LN(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]))
返回di

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

一种方法是使用一个“less”(比较器)函数,该函数只返回两个给定值与目标值之间距离的较小值

例如():

func main(){
xs:=[]整数{2781470613471192,3087,29201982312930930328416773687261982014107414841952159212632903}
sortByDistanceFrom(1200,xs)
格式打印LN(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]))
返回di

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

我认为您最好编写一个满足
sort.Interface
类型的自定义类型。更多信息请参见。注意,930距离1200不远,它应该位于排序数组的末尾。我将在下面发布一个完整的解决方案。我认为您最好的选择是编写一个满足
sort.Interface
类型的自定义类型。更多信息请参见。注意,930距离1200不远,它应该位于排序数组的末尾。我将在下面发布完整的解决方案。
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
  })
}