Как отсортировать байты в строке? - PullRequest
0 голосов
/ 20 марта 2020

Я хотел отсортировать символы в строке, но не работал должным образом:

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"))
}

Я ожидаю, что он напечатает:

ant
ant
true

Но на самом деле напечатано:

ant
atn
false

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

1 Ответ

5 голосов
/ 20 марта 2020

Вы сортируете bs, но используете для сравнения str:

sort.Slice(bs, func(a, b int) bool {
    return str[a] < str[b]
})

Операция bs := []byte(str) копирует строку в байтовый массив и создает из него фрагмент. Поэтому при сортировке вы перемещаете символы в срезе bs, но сравниваете символы в исходной строке, и они не перемещаются сортировкой.

Используйте правильное сравнение:

sort.Slice(bs, func(a, b int) bool {
    return bs[a] < bs[b]
})
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...