在 go 中对 uint64 切片进行排序

问题描述 投票:0回答:5

我正在使用 Go 1.7rc3 编写 Go 应用程序。

我有一片

uint64
(
var dirRange []uint64
) 想要排序。

排序包有一个功能

sort.Ints()
,但它需要
[]int
,而我有
[]uint64

我该怎么办?我可以输入cast all slice吗?

go slice
5个回答
69
投票

从1.8版本开始,您可以使用更简单的功能

sort.Slice
。在你的情况下,它将类似于以下内容:

sort.Slice(dirRange, func(i, j int) bool { return dirRange[i] < dirRange[j] })

这避免了仅仅为了排序而定义任何类型。


13
投票

您可以在

sort.Interface
上定义
dirRange
,这可以是类型别名
[]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)

0
投票

您可以为 []uint64 提供类型别名,添加标准的“样板”排序方法来实现

sort.interface
Len
Swap
Less
- https://golang.org/pkg/排序/#接口);然后创建新类型的实例或将现有切片 []uint64 类型转换为新类型,如以下示例所示(另见 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}

表明两个数组都已排序,因为第二个数组是原始数组的类型转换别名。


0
投票

没有wrapper函数,需要使用Slice函数,这是一个例子:

arr := []uint64{5, 0, 3, 2, 1, 6}

sort.Slice(arr, func(i, j int) bool { return arr[i] < arr[j] })

0
投票

这可以在上面的评论中

sort.Sort(uint64arr(dirRange))

dirRange 将被排序,不需要 arr:=

© www.soinside.com 2019 - 2024. All rights reserved.