排序.切片排序不正确


abc := []byte{'a', 'c', 'b'}  
sort.Slice(abc[1:], func(i, j int) bool {
return abc[i] < abc[j]
})
fmt.Println(string(abc)) //print acb

上面的代码无法正确排序abc。为什么?

因为您传递了abc[1:]子切片进行排序,但在less()函数中,您将abc原始(完整(切片编制索引。sort.Slice()将根据您传递给它的切片将索引值传递给less()进行排序,并在另一个切片(原始切片(上使用这些索引,您将比较意外元素并向sort.Slice()报告错误信息。

如果您使用相同的切片,它可以工作:

sort.Slice(abc[1:], func(i, j int) bool {
return abc[1:][i] < abc[1:][j]
})

如果在索引原始切片时手动添加偏移量,它也可以工作:

sort.Slice(abc[1:], func(i, j int) bool {
return abc[1+i] < abc[1+j]
})

当然,存储这个切片会更好、更干净、更高效:

s := abc[1:]
sort.Slice(s, func(i, j int) bool {
return s[i] < s[j]
})

在Go Playground上尝试这些示例。

最新更新