Как узнать положение элемента в срезе? - PullRequest
91 голосов
/ 29 ноября 2011

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

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

type intSlice []int

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

Ответы [ 6 ]

61 голосов
/ 29 ноября 2011

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

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

Если у вас есть кусочек байта, есть bytes.IndexByte .

47 голосов
/ 13 августа 2013

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

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" }))
8 голосов
/ 18 января 2018

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

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

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

5 голосов
/ 30 ноября 2011

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

1 голос
/ 16 марта 2018
func index(slice []string, item string) int {
    for i, _ := range slice {
        if slice[i] == item {
            return i
        }
    }
    return -1
}
1 голос
/ 29 ноября 2011

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

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

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

...