V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
The Go Programming Language
http://golang.org/
Go Playground
Go Projects
Revel Web Framework
coordinate
V2EX  ›  Go 编程语言

go 怎么使用外部变量进行排序?

  •  
  •   coordinate · 2019-10-22 19:18:18 +08:00 · 2598 次点击
    这是一个创建于 1861 天前的主题,其中的信息可能已经有所发展或是发生改变。

    例如下面代码,我需要通过A的大小来排序d,我采用下面的写法:

    func func(A []int) int {
        n := len(A)
        d := make([]int, n)
        for i := 0; i < n; i++ {
            d[i] = i
        }
        sort.SliceStable(d, func(i, j int) bool {
            return A[i] < A[j]
        })
    }
    

    上面的结果是错误的,为什么?我该如何操作?

    7 条回复    2019-10-23 10:11:21 +08:00
    petelin
        1
    petelin  
       2019-10-22 19:51:05 +08:00 via iPhone
    因为 A 没有变化
    petelin
        2
    petelin  
       2019-10-22 19:51:23 +08:00 via iPhone
    定一个 less 方法操作 A
    Maboroshii
        3
    Maboroshii  
       2019-10-22 19:57:04 +08:00
    自己写一个
    reus
        4
    reus  
       2019-10-22 20:02:35 +08:00
    应该写成 return A[d[i]] < A[d[j]],i 和 j 是 d 的索引,不是 A 的索引
    yifanes
        5
    yifanes  
       2019-10-22 20:06:46 +08:00
    ```golang
    package main

    import (
    "fmt"
    "sort"
    )

    type Animal struct {
    Nickname string
    Age int
    }
    type ByAge []Animal

    func (b ByAge) Len() int {
    return len(b)
    }

    func (b ByAge) Less(i, j int) bool {
    return b[i].Age < b[j].Age
    }

    func (b ByAge) Swap(i, j int) {
    b[i], b[j] = b[j], b[i]
    }

    func main() {
    //string slice sort
    a := []string{"c", "_", "ac"}
    sort.Strings(a)
    fmt.Println(a)
    //int slice sort
    b := []int{5, 2, 1, 7}
    sort.Ints(b)
    fmt.Println(b)
    //float64 slice sort
    c := []float64{3.14, 2, 5.0}
    sort.Float64s(c)
    fmt.Println(c)

    //struct
    Person := [] struct {
    Name string
    Age int
    }{
    {
    Name: "Abot",
    Age: 34,
    },
    {
    Name: "Cbot",
    Age: 12,
    },
    }
    sort.SliceStable(Person, func(i, j int) bool {
    return Person[i].Age < Person[j].Age
    })

    fmt.Println(Person)

    //面向接口编程的做法
    animal := []Animal{
    {
    Age: 3,
    Nickname: "dog",
    },
    {
    Age: 1,
    Nickname: "dog",
    },
    }
    sort.Sort(ByAge(animal))
    fmt.Println(animal)

    //map
    //map 排序最扯淡
    m := map[string]int{"abc": 1, "oks": 3, "edd": 4}
    keys := make([]string, 0, len(m))
    for k := range m {
    keys = append(keys, k)
    }
    sort.Strings(keys)
    for _, k := range keys {
    fmt.Println(k, m[k])
    }
    }
    ```
    yifanes
        6
    yifanes  
       2019-10-22 20:09:12 +08:00
    为了你这个问题,我撸了个通用的代码,方便你一次 get 到,但是这个排版不能编辑,我也是醉了....
    zdt3476
        7
    zdt3476  
       2019-10-23 10:11:21 +08:00
    既然你希望排序 d,为啥没见到你把 d 进行返回,不是很懂你的逻辑。 不过排序这段逻辑是没啥问题的,可以这样写。
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   实用小工具   ·   3133 人在线   最高记录 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 25ms · UTC 13:59 · PVG 21:59 · LAX 05:59 · JFK 08:59
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.