duanshan1977 2018-07-31 21:03

# 在golang中排序int切片

say I have an int slice containing the following numbers: 2781,4706,1347,1192,3087,2920,198,2312,930,3284,1677,3687,2011,4107,4148,4195,2159,1263,2918,2503

I want to sort them based on how close they are away from a certain value. For example, say my value was 1200.

My slice after being sorted would be: 1192,1263,1347,1677,2011,2159,2312,2503,2781,2918,2920,3087,3284,3687,4107,4148,4195,4706,930,198

I tried the approach of iterating through the array, subtracting my specified value, then sorting in ascending order ultimately adding the value again to return to my original number. This approach wouldn't work in all test cases, and I know its bad practice since I'm mutating the array.

• 写回答

#### 1条回答默认 最新

• donglieshe4692 2018-07-31 21:42
关注

One approach would be to use `sort.Slice(...)` with a "less" (comparator) function that simply returns the lesser of the distance of the two given values from the target value.

For example (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
})
}
``````

Note that the fourth value returned by this example is 930 instead of 1677 produced by your sample output because it computes the absolute distance to the target number (`|1200-1677|=433 > |1200-930|=270`). If you want to prefer values greater than the target to values less than the target then you would have to modify your comparator function accordingly.

本回答被题主选为最佳回答 , 对您是否有帮助呢?
评论

#### 悬赏问题

• ¥15 访问完之后帮我爬取下来内容并给我代码
• ¥15 YOLOv8已有一个初步的检测模型，想利用这个模型对新的图片进行自动标注，生成labellmg可以识别的数据，再手动修改。如何操作？
• ¥15 怎么做商品窗体，完完全全不会
• ¥30 NIRfast软件使用指导
• ¥20 matlab仿真问题，求功率谱密度
• ¥15 求micropython modbus-RTU 从机的代码或库？
• ¥15 铜与钢双金属板叠加在一起每种材料300mm长，18mm宽，4mm厚一端固定并加热至80℃，当加热端温度保持不变时另一端的稳态温度。ansys
• ¥15 django5安装失败
• ¥15 Java与Hbase相关问题
• ¥15 后缀 crn 游戏文件提取资源