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

8 回复

因为 A 没有变化

更多关于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 &lt; 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 &lt; 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接口来自定义排序规则。下面是一个简单的例子,展示如何使用外部变量进行排序:

假设你有一个结构体切片,并且你想根据一个外部变量(比如一个映射表)来决定排序顺序。

  1. 定义结构体切片。
  2. 创建一个映射表(外部变量),用于存储排序权重。
  3. 实现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

这种方法灵活且强大,适用于各种需要自定义排序逻辑的场景。

回到顶部