【问题标题】:sort.Slice does not sort correctly [closed]sort.Slice 没有正确排序[关闭]
【发布时间】:2020-05-21 05:51:33
【问题描述】:
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。为什么?

【问题讨论】:

    标签: sorting go slice


    【解决方案1】:

    因为您将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 上的示例。

    【讨论】:

      猜你喜欢
      • 2016-04-18
      • 1970-01-01
      • 1970-01-01
      • 2015-04-14
      • 2016-03-15
      • 1970-01-01
      • 2022-11-25
      • 2020-04-26
      • 2014-09-07
      相关资源
      最近更新 更多