例如下面代码,我需要通过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]
})
}
上面的结果是错误的,为什么?我该如何操作?
1
petelin 2019-10-22 19:51:05 +08:00 via iPhone
因为 A 没有变化
|
2
petelin 2019-10-22 19:51:23 +08:00 via iPhone
定一个 less 方法操作 A
|
3
Maboroshii 2019-10-22 19:57:04 +08:00
自己写一个
|
4
reus 2019-10-22 20:02:35 +08:00
应该写成 return A[d[i]] < A[d[j]],i 和 j 是 d 的索引,不是 A 的索引
|
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]) } } ``` |
6
yifanes 2019-10-22 20:09:12 +08:00
为了你这个问题,我撸了个通用的代码,方便你一次 get 到,但是这个排版不能编辑,我也是醉了....
|
7
zdt3476 2019-10-23 10:11:21 +08:00
既然你希望排序 d,为啥没见到你把 d 进行返回,不是很懂你的逻辑。 不过排序这段逻辑是没啥问题的,可以这样写。
|