首页 > 解决方案 > sort.Slice 没有正确排序

问题描述

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正确排序。为什么?

标签: sortinggoslice

解决方案


因为您将子切片传递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上的示例。


推荐阅读