请教个 golang float64 slice 排序问题

2022-08-30 11:11:43 +08:00
 wtfedc

sort.Slice 的第二个参数,如果使用了和第一个参数没关系的变量,为什么就失效了。自己眼拙,从源码里没看出什么玄机
代码:

package main

import (
	"log"
	"math"
	"sort"
)

func main() {
	// 排序正常操作
	c := []float64{1308.24, 1912.5900000000001, 0, 5164.84, 6375.8, 6032.639999999999, 5794.66, 190.79, 4472.87, 5290.28, 185.26, 459.59, 139.39, 95.39}
	sort.Slice(c, func(i, j int) bool { return c[i] > c[j] })
	log.Println("sorted c by float:", c)

	// less 函数中使用外部变量, 排序有问题
	var d = make([]int, len(c))
	for idx, item := range c {
		d[idx] = int(math.Round(item))
	}
	sort.Slice(c, func(i, j int) bool { return d[i] > d[j] })
	log.Println("sorted c by int:", c)
}

输出:

2022/08/30 11:07:12 sorted c by float: [6375.8 6032.639999999999 5794.66 5290.28 5164.84 4472.87 1912.5900000000001 1308.24 459.59 190.79 185.26 139.39 95.39 0]
2022/08/30 11:07:12 sorted c by int: [1308.24 6375.8 5794.66 5290.28 5164.84 4472.87 1912.5900000000001 6032.639999999999 459.59 190.79 185.26 139.39 95.39 0]
596 次点击
所在节点    问与答
2 条回复
sujin190
2022-08-30 11:32:12 +08:00
sort 过程中并没有创建新 slice ,那么说明排序过程会交换变量位置,你这个第二个排序过程中 c 和 d 两个 slice 中相同索引位置已经不是最开始相同元素了啊,排序结果当然是不对的,这个很明显的吧
wtfedc
2022-08-30 11:36:19 +08:00
@sujin190 哎呀,一言点醒我梦中人,非常感谢。
以前从 js 的 lodash 这么用习惯了,放 go 里边不好使了

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/876419

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX