it-swarm.com.de

Wie kann man die Elementposition in Scheiben ermitteln?

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
}
86
OCyril

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 .

58
Evan Shaw

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" }))
46
Anton Shelin

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.

6
PodTech.io

Dafür gibt es keine Bibliotheksfunktion. Sie müssen selbst codieren.

5
alessandro

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.

1
robothor
func index(slice []string, item string) int {
    for i, _ := range slice {
        if slice[i] == item {
            return i
        }
    }
    return -1
}
0
user60679