如何对字符串中的字节进行排序?

Leo*_*ang -1 go

我想对字符串中的字符进行排序,但没有按预期工作:

package main

import (
    "fmt"
    "sort"
)

func getKey(str string) string {
    bs := []byte(str)
    sort.Slice(bs, func(a, b int) bool {
        return str[a] < str[b]
    })
    return string(bs)
}

func main() {
    fmt.Printf("%v\n", getKey("nat"))
    fmt.Printf("%v\n", getKey("tan")) // expect to get "ant", but got "atn"
    fmt.Printf("%v\n", getKey("tan") == getKey("nat"))
}
Run Code Online (Sandbox Code Playgroud)

我希望它打印:

ant
ant
true
Run Code Online (Sandbox Code Playgroud)

但实际打印:

ant
atn
false
Run Code Online (Sandbox Code Playgroud)

https://play.golang.org/p/CtozIz0M6_K

Bur*_*dar 5

您正在排序bs,但str用于比较:

sort.Slice(bs, func(a, b int) bool {
    return str[a] < str[b]
})
Run Code Online (Sandbox Code Playgroud)

bs := []byte(str)操作将字符串复制到一个字节数组并从中创建一个切片。因此,当您排序时,您会移动bs切片中的字符,但比较原始字符串中的字符,这些字符不会被排序移动。

使用正确的比较:

sort.Slice(bs, func(a, b int) bool {
    return bs[a] < bs[b]
})
Run Code Online (Sandbox Code Playgroud)