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