Golang Go语言怎么使用外部变量进行排序?
Golang Go语言怎么使用外部变量进行排序?
例如下面代码,我需要通过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]
})
}
上面的结果是错误的,为什么?我该如何操作?
更多关于Golang Go语言怎么使用外部变量进行排序?的实战教程也可以访问 https://www.itying.com/category-94-b0.html
定一个 less 方法操作 A
自己写一个
应该写成 return A[d[i]] < A[d[j]],i 和 j 是 d 的索引,不是 A 的索引
golang<br>package main<br><br>import (<br> "fmt"<br> "sort"<br>)<br><br>type Animal struct {<br> Nickname string<br> Age int<br>}<br>type ByAge []Animal<br><br>func (b ByAge) Len() int {<br> return len(b)<br>}<br><br>func (b ByAge) Less(i, j int) bool {<br> return b[i].Age < b[j].Age<br>}<br><br>func (b ByAge) Swap(i, j int) {<br> b[i], b[j] = b[j], b[i]<br>}<br><br>func main() {<br> //string slice sort<br> a := []string{"c", "_", "ac"}<br> sort.Strings(a)<br> fmt.Println(a)<br> //int slice sort<br> b := []int{5, 2, 1, 7}<br> sort.Ints(b)<br> fmt.Println(b)<br> //float64 slice sort<br> c := []float64{3.14, 2, 5.0}<br> sort.Float64s(c)<br> fmt.Println(c)<br><br> //struct<br> Person := [] struct {<br> Name string<br> Age int<br> }{<br> {<br> Name: "Abot",<br> Age: 34,<br> },<br> {<br> Name: "Cbot",<br> Age: 12,<br> },<br> }<br> sort.SliceStable(Person, func(i, j int) bool {<br> return Person[i].Age < Person[j].Age<br> })<br><br> fmt.Println(Person)<br><br> //面向接口编程的做法<br> animal := []Animal{<br> {<br> Age: 3,<br> Nickname: "dog",<br> },<br> {<br> Age: 1,<br> Nickname: "dog",<br> },<br> }<br> sort.Sort(ByAge(animal))<br> fmt.Println(animal)<br><br> //map<br> //map 排序最扯淡<br> m := map[string]int{"abc": 1, "oks": 3, "edd": 4}<br> keys := make([]string, 0, len(m))<br> for k := range m {<br> keys = append(keys, k)<br> }<br> sort.Strings(keys)<br> for _, k := range keys {<br> fmt.Println(k, m[k])<br> }<br>}<br>
为了你这个问题,我撸了个通用的代码,方便你一次 get 到,但是这个排版不能编辑,我也是醉了…
既然你希望排序 d,为啥没见到你把 d 进行返回,不是很懂你的逻辑。 不过排序这段逻辑是没啥问题的,可以这样写。
在Golang(Go语言)中,使用外部变量进行排序通常涉及到自定义排序逻辑。Go的sort
包提供了强大的排序功能,允许你通过实现sort.Interface
接口来自定义排序规则。下面是一个简单的例子,展示如何使用外部变量进行排序:
假设你有一个结构体切片,并且你想根据一个外部变量(比如一个映射表)来决定排序顺序。
- 定义结构体切片。
- 创建一个映射表(外部变量),用于存储排序权重。
- 实现
sort.Interface
接口的Len()
,Less()
, 和Swap()
方法,其中Less()
方法使用映射表来决定排序顺序。
package main
import (
"fmt"
"sort"
)
type Item struct {
Name string
}
func main() {
items := []Item{{"apple"}, {"banana"}, {"cherry"}}
weights := map[string]int{"apple": 2, "banana": 1, "cherry": 3}
sort.Slice(items, func(i, j int) bool {
return weights[items[i].Name] < weights[items[j].Name]
})
for _, item := range items {
fmt.Println(item.Name)
}
}
在这个例子中,sort.Slice
函数接受一个切片和一个比较函数。比较函数利用外部变量weights
来决定排序顺序。运行此代码将输出按权重排序的项:banana
, apple
, cherry
。
这种方法灵活且强大,适用于各种需要自定义排序逻辑的场景。