如果你的Go程序中有一个包含数字的片断或字符串数组,而你想按自然顺序而不是按字母顺序排序,你需要自己写一个排序函数,使用 sort.Slice().它应该将每个元素转换为int 或float 类型,并进行数字比较。其结果将是一个像数字一样排序的字符串片断。
按自然顺序排序
package main
import (
"fmt"
"log"
"sort"
"strconv"
)
func sortNumbers(data []string) ([]string, error) {
var lastErr error
sort.Slice(data, func(i, j int) bool {
a, err := strconv.ParseInt(data[i], 10, 64)
if err != nil {
lastErr = err
return false
}
b, err := strconv.ParseInt(data[j], 10, 64)
if err != nil {
lastErr = err
return false
}
return a < b
})
return data, lastErr
}
func main() {
data := []string{"10", "1", "2", "8", "4", "3", "9", "7", "6", "5"}
sorted, err := sortNumbers(data)
if err != nil {
log.Fatal(err)
}
fmt.Println(sorted)
}
输出
[1 2 3 4 5 6 7 8 9 10]
正如你在sortNumber() 函数中看到的,我们返回两个元素比较的最后一个错误。如果一个给定的元素不能转换为数字,这意味着输入的数据是无效的,排序的结果可能是错误的。你应该在你的应用程序中处理这个错误,以避免意外的结果。
按字母顺序排序
然而,如果你的目标是按字母顺序对字符串进行排序,只要使用 sort.Strings()函数。
package main
import (
"fmt"
"sort"
)
func main() {
data := []string{"10", "1", "2", "8", "4", "3", "9", "7", "6", "5"}
sort.Strings(data)
fmt.Println(data)
}
输出
[1 10 2 3 4 5 6 7 8 9]