切片索引排序

我想对元素的索引进行排序而不是对切片进行排序。因为[]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] 

}


繁华开满天机
浏览 69回答 1
1回答

守着一只汪

您的less()函数获取的索引是可排序切片 (&nbsp;indices) 的索引,而不是另一个 (&nbsp;arr) 切片的索引。所以使用i和j索引indices。结果当然是用于arr切片的索引(这是您对切片的定义),因此您可以使用表达式和indices获得可比较的元素。arr[indices[i]arr[indices[j]]并且不要使用strings.Compare(),只需使用 less<运算符比较字符串。有关详细信息,请参阅Go 比较字符串。sort.Slice(indices, func(i, j int) bool {&nbsp; &nbsp; return arr[indices[i]] < arr[indices[j]]})通过此更改,您可以获得预期的输出(在Go Playground上尝试):[dog cat apple bat] [2 3 1 0][apple bat cat dog]
打开App,查看更多内容
随时随地看视频慕课网APP

相关分类

Go