切片索引排序
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
) 切片的索引。
所以使用i
和j
索引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]
我想对元素的索引进行排序,而不是对切片进行排序。对于 []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
) 切片的索引。
所以使用i
和j
索引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]