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

2019-10-22 19:18:18 +08:00
 coordinate

例如下面代码,我需要通过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]
    })
}

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

2618 次点击
所在节点    Go 编程语言
7 条回复
petelin
2019-10-22 19:51:05 +08:00
因为 A 没有变化
petelin
2019-10-22 19:51:23 +08:00
定一个 less 方法操作 A
Maboroshii
2019-10-22 19:57:04 +08:00
自己写一个
reus
2019-10-22 20:02:35 +08:00
应该写成 return A[d[i]] < A[d[j]],i 和 j 是 d 的索引,不是 A 的索引
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
2019-10-22 20:09:12 +08:00
为了你这个问题,我撸了个通用的代码,方便你一次 get 到,但是这个排版不能编辑,我也是醉了....
zdt3476
2019-10-23 10:11:21 +08:00
既然你希望排序 d,为啥没见到你把 d 进行返回,不是很懂你的逻辑。 不过排序这段逻辑是没啥问题的,可以这样写。

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

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

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

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

© 2021 V2EX