为了账号安全,请及时绑定邮箱和手机立即绑定

切片索引排序

切片索引排序

Go
繁华开满天机 2022-12-05 11:15:33
我想对元素的索引进行排序而不是对切片进行排序。因为[]string{"dog","cat","apple","bat"}我想得到[]int{2,3,1,0}package mainimport (    "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] }
查看完整描述

1 回答

?
守着一只汪

TA贡献1872条经验 获得超3个赞

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

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

并且不要使用strings.Compare(),只需使用 less<运算符比较字符串。有关详细信息,请参阅Go 比较字符串

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]


查看完整回答
反对 回复 2022-12-05
  • 1 回答
  • 0 关注
  • 68 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信