Как узнать положение элемента в срезе?



Как определить положение элемента в срезе?



Мне нужно что-то вроде следующего:



type intSlice []int

func (slice intSlice) pos(value int) int {
for p, v := range slice {
if (v == value) {
return p
}
}
return -1
}
660   6  

6 ответов:

извините, для этого нет универсальной библиотечной функции. Go не имеет прямого способа написания функции, которая может работать на любом срезе.

ваша функция работает, хотя было бы немного лучше, если бы вы написали это с помощью range.

Если у вас есть байтовый срез, там байт.IndexByte.

вы можете создать универсальную функцию в идиоматическом пути:

func SliceIndex(limit int, predicate func(i int) bool) int {
    for i := 0; i < limit; i++ {
        if predicate(i) {
            return i
        }
    }
    return -1
}

и использование:

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

для этого нет библиотечной функции. Вы должны кодировать самостоятельно.

вы можете написать функцию;

func indexOf(element string, data []string) (int) {
   for k, v := range data {
       if element == v {
           return k
       }
   }
   return -1    //not found.
}

возвращает индекс символа / строки, если он соответствует элементу. Если он не найден, возвращает значение -1.

другой вариант-сортировать срез с помощью пакета сортировки, а затем искать то, что вы ищете:

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

печать

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

это работает для основных типов и вы всегда можете реализовать подобного интерфейса для своего типа если вы должны работать на срез прочего. См.http://golang.org/pkg/sort

зависит от того, что вы делаете, хотя.

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

Comments

    Ничего не найдено.