在 go 中对 uint64 切片进行排序
sorting a uint64 slice in go
我正在使用 Go 1.7rc3 编写 Go 应用程序。
我有一块 uint64 (var dirRange []uint64
) 想要排序。
排序包有一个函数 sort.Ints()
但它需要 []int
而我有 []uint64
。
我该怎么办?我可以输入 all slice 吗?
谢谢
您可以在 dirRange
上定义 sort.Interface
,它可以是类型别名 []uint64
:
type DirRange []uint64
func (a DirRange) Len() int { return len(a) }
func (a DirRange) Swap(i, j int) { a[i], a[j] = a[j], a[i] }
func (a DirRange) Less(i, j int) bool { return a[i] < a[j] }
func main() {
dirRange := DirRange{2, 5, 7, 1, 9, 4}
sort.Sort(dirRange)
fmt.Println(dirRange)
}
输出:
[1 2 4 5 7 9]
这样您就可以避免转换并直接使用您的数组。由于底层类型是一个切片[]uint64
,你仍然可以使用一般的切片操作。例如:
dirRange := make(DirRange, 10)
dirRange = append(dirRange, 2)
您可以为 []uint64 提供类型别名,添加标准 "boilerplate" 排序方法以实现 sort.interface
(Len
、Swap
和 Less
- https://golang.org/pkg/sort/#Interface); then either create an instance of the new type or typecast an existing slice []uint64 into the new type, as done in the following example (also https://play.golang.org/p/BbB3L9TmBI):
package main
import (
"fmt"
"sort"
)
type uint64arr []uint64
func (a uint64arr) Len() int { return len(a) }
func (a uint64arr) Swap(i, j int) { a[i], a[j] = a[j], a[i] }
func (a uint64arr) Less(i, j int) bool { return a[i] < a[j] }
func (a uint64arr) String() (s string) {
sep := "" // for printing separating commas
for _, el := range a {
s += sep
sep = ", "
s += fmt.Sprintf("%d", el)
}
return
}
func main() {
dirRange := []uint64{3, 2, 400000}
arr := uint64arr(dirRange)
sort.Sort(arr)
fmt.Printf("%s\n", arr)
fmt.Printf("%#v\n", dirRange)
}
输出为:
2, 3, 400000
[]uint64{0x2, 0x3, 0x61a80}
显示两个数组都已排序,因为第二个数组是原始数组的别名。
从 1.8 版开始,您可以使用更简单的函数 sort.Slice
。在您的情况下,它将类似于以下内容:
sort.Slice(dirRange, func(i, j int) bool { return dirRange[i] < dirRange[j] })
这避免了为排序定义任何类型。
没有wrapper函数,需要使用Slice函数,这是一个例子:
arr := []uint64{5, 0, 3, 2, 1, 6}
sort.Slice(arr, func(i, j int) bool { return arr[i] < arr[j] })
我正在使用 Go 1.7rc3 编写 Go 应用程序。
我有一块 uint64 (var dirRange []uint64
) 想要排序。
排序包有一个函数 sort.Ints()
但它需要 []int
而我有 []uint64
。
我该怎么办?我可以输入 all slice 吗?
谢谢
您可以在 dirRange
上定义 sort.Interface
,它可以是类型别名 []uint64
:
type DirRange []uint64
func (a DirRange) Len() int { return len(a) }
func (a DirRange) Swap(i, j int) { a[i], a[j] = a[j], a[i] }
func (a DirRange) Less(i, j int) bool { return a[i] < a[j] }
func main() {
dirRange := DirRange{2, 5, 7, 1, 9, 4}
sort.Sort(dirRange)
fmt.Println(dirRange)
}
输出:
[1 2 4 5 7 9]
这样您就可以避免转换并直接使用您的数组。由于底层类型是一个切片[]uint64
,你仍然可以使用一般的切片操作。例如:
dirRange := make(DirRange, 10)
dirRange = append(dirRange, 2)
您可以为 []uint64 提供类型别名,添加标准 "boilerplate" 排序方法以实现 sort.interface
(Len
、Swap
和 Less
- https://golang.org/pkg/sort/#Interface); then either create an instance of the new type or typecast an existing slice []uint64 into the new type, as done in the following example (also https://play.golang.org/p/BbB3L9TmBI):
package main
import (
"fmt"
"sort"
)
type uint64arr []uint64
func (a uint64arr) Len() int { return len(a) }
func (a uint64arr) Swap(i, j int) { a[i], a[j] = a[j], a[i] }
func (a uint64arr) Less(i, j int) bool { return a[i] < a[j] }
func (a uint64arr) String() (s string) {
sep := "" // for printing separating commas
for _, el := range a {
s += sep
sep = ", "
s += fmt.Sprintf("%d", el)
}
return
}
func main() {
dirRange := []uint64{3, 2, 400000}
arr := uint64arr(dirRange)
sort.Sort(arr)
fmt.Printf("%s\n", arr)
fmt.Printf("%#v\n", dirRange)
}
输出为:
2, 3, 400000
[]uint64{0x2, 0x3, 0x61a80}
显示两个数组都已排序,因为第二个数组是原始数组的别名。
从 1.8 版开始,您可以使用更简单的函数 sort.Slice
。在您的情况下,它将类似于以下内容:
sort.Slice(dirRange, func(i, j int) bool { return dirRange[i] < dirRange[j] })
这避免了为排序定义任何类型。
没有wrapper函数,需要使用Slice函数,这是一个例子:
arr := []uint64{5, 0, 3, 2, 1, 6}
sort.Slice(arr, func(i, j int) bool { return arr[i] < arr[j] })