切片索引排序

Sort indices of slice

我想对元素的索引进行排序,而不是对切片进行排序。对于 []string{"dog","cat","apple","bat"} 我想得到 []int{2,3,1,0}

package main

import (
    "fmt"
    "sort"
    "strings"
)

func main() {
    arr := []string{"dog","cat","apple","bat"}
    n := len(arr)
    indices := make([]int, n)
    for i:=0;i<n;i++{
        indices[i]=i
    }
    sort.Slice(indices, func(i,j int) bool {return strings.Compare(arr[i],arr[j])<0})
    fmt.Println(arr, indices) // [dog cat apple bat] [2 1 0 3]
    
    sort.Slice(arr, func(i,j int) bool {return strings.Compare(arr[i],arr[j])<0})
    fmt.Println(arr) //[apple bat cat dog] 
}

您的 less() 函数获取的索引是可排序切片 (indices) 的索引,而不是另一个 (arr) 切片的索引。

所以使用ij索引indices。结果当然是用于 arr 切片的索引(这是您对 indices 切片的定义),因此您可以使用表达式 arr[indices[i]arr[indices[j]].

并且不要使用 strings.Compare(), simply compare strings using the less < operator. For details, see Go compare strings

sort.Slice(indices, func(i, j int) bool {
    return arr[indices[i]] < arr[indices[j]]
})

通过此更改,您将获得预期的输出(在 Go Playground 上尝试):

[dog cat apple bat] [2 3 1 0]
[apple bat cat dog]