Wie kann man die Position eines Elements in einer Schicht bestimmen?
Ich brauche etwas wie das Folgende:
type intSlice []int
func (slice intSlice) pos(value int) int {
for p, v := range slice {
if (v == value) {
return p
}
}
return -1
}
Leider gibt es keine generische Bibliotheksfunktion, um dies zu tun. Go hat keine einfache Möglichkeit, eine Funktion zu schreiben, die für jedes Slice geeignet ist.
Ihre Funktion funktioniert, obwohl es etwas besser wäre, wenn Sie sie mit range
schreiben würden.
Wenn Sie ein Byte-Slice haben, gibt es bytes.IndexByte .
Sie können generische Funktionen auf idiomatische Weise erstellen:
func SliceIndex(limit int, predicate func(i int) bool) int {
for i := 0; i < limit; i++ {
if predicate(i) {
return i
}
}
return -1
}
Und Verwendung:
xs := []int{2, 4, 6, 8}
ys := []string{"C", "B", "K", "A"}
fmt.Println(
SliceIndex(len(xs), func(i int) bool { return xs[i] == 5 }),
SliceIndex(len(xs), func(i int) bool { return xs[i] == 6 }),
SliceIndex(len(ys), func(i int) bool { return ys[i] == "Z" }),
SliceIndex(len(ys), func(i int) bool { return ys[i] == "A" }))
Sie könnten eine Funktion schreiben.
func indexOf(element string, data []string) (int) {
for k, v := range data {
if element == v {
return k
}
}
return -1 //not found.
}
Dies gibt den Index eines Zeichens/einer Zeichenfolge zurück, wenn er mit dem Element übereinstimmt. Wenn es nicht gefunden wird, wird -1 zurückgegeben.
Dafür gibt es keine Bibliotheksfunktion. Sie müssen selbst codieren.
Eine andere Möglichkeit besteht darin, das Slice anhand des Sortierpakets zu sortieren und dann nach dem gesuchten Objekt zu suchen:
package main
import (
"sort"
"log"
)
var ints = [...]int{74, 59, 238, -784, 9845, 959, 905, 0, 0, 42, 7586, -5467984, 7586}
func main() {
data := ints
a := sort.IntSlice(data[0:])
sort.Sort(a)
pos := sort.SearchInts(a, -784)
log.Println("Sorted: ", a)
log.Println("Found at index ", pos)
}
druckt
2009/11/10 23:00:00 Sorted: [-5467984 -784 0 0 42 59 74 238 905 959 7586 7586 9845]
2009/11/10 23:00:00 Found at index 1
Dies funktioniert für die Basistypen, und Sie können die Sortieroberfläche immer für Ihren eigenen Typ implementieren, wenn Sie andere Dinge bearbeiten müssen. Siehe http://golang.org/pkg/sort
Kommt drauf an was du tust.
func index(slice []string, item string) int {
for i, _ := range slice {
if slice[i] == item {
return i
}
}
return -1
}