V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
V2EX 提问指南
wtfedc
V2EX  ›  问与答

请教个 golang float64 slice 排序问题

  •  
  •   wtfedc · 2022-08-30 11:11:43 +08:00 · 724 次点击
    这是一个创建于 840 天前的主题,其中的信息可能已经有所发展或是发生改变。

    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]
    
    2 条回复    2022-08-30 11:36:19 +08:00
    sujin190
        1
    sujin190  
       2022-08-30 11:32:12 +08:00
    sort 过程中并没有创建新 slice ,那么说明排序过程会交换变量位置,你这个第二个排序过程中 c 和 d 两个 slice 中相同索引位置已经不是最开始相同元素了啊,排序结果当然是不对的,这个很明显的吧
    wtfedc
        2
    wtfedc  
    OP
       2022-08-30 11:36:19 +08:00
    @sujin190 哎呀,一言点醒我梦中人,非常感谢。
    以前从 js 的 lodash 这么用习惯了,放 go 里边不好使了
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   实用小工具   ·   5841 人在线   最高记录 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 34ms · UTC 02:06 · PVG 10:06 · LAX 18:06 · JFK 21:06
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.