it-swarm.com.de

sortieren eines uint64-Slice in go

Ich schreibe Go-Anwendung mit Go 1.7rc3.

Ich habe ein Stück von uint64 (var dirRange []uint64), das ich sortieren möchte.

das Sortierpaket hat eine Funktion sort.Ints(), aber es erfordert []int und ich habe []uint64

was mache ich? kann ich die ganze Scheibe tippen?

vielen Dank

13
ufk

Ab Version 1.8 können Sie die einfachere Funktion sort.Slice verwenden. In Ihrem Fall würde es ungefähr so ​​aussehen:

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

Dadurch wird vermieden, dass Sie einen beliebigen Typ nur für die Sortierung definieren müssen.

18
vicentazo

Sie können sort.Interface in Ihrer dirRange definieren. Dies kann ein Typ-Aliasing von []uint64 sein:

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

Ausgabe:

[1 2 4 5 7 9]

Auf diese Weise können Sie Casting vermeiden und direkt mit Ihrem Array arbeiten. Da der zugrunde liegende Typ ein Slice []uint64 ist, können Sie dennoch allgemeine Slice-Operationen verwenden. Zum Beispiel:

dirRange := make(DirRange, 10)
dirRange = append(dirRange, 2)
8
abhink

Sie können einen Typalias für [] uint64 angeben. Fügen Sie die Standardsortiermethoden "boilerplate" hinzu, um sort.interface (Len, Swap und Less - https://golang.org/pkg/sort/#Interface ) zu implementieren. Erstellen Sie dann entweder eine Instanz des neuen Typs oder typisieren Sie ein vorhandenes Slice [] uint64 in den neuen Typ, wie im folgenden Beispiel beschrieben (auch 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)
}

Die Ausgabe ist:

2, 3, 400000
[]uint64{0x2, 0x3, 0x61a80}

zeigt an, dass beide Arrays sortiert sind, da das zweite Array ein Alias ​​für das Original ist. 

0
dmitris