スライスに存在する要素の位置をどのように決定しますか?
次のようなものが必要です。
type intSlice []int
func (slice intSlice) pos(value int) int {
for p, v := range slice {
if (v == value) {
return p
}
}
return -1
}
申し訳ありませんが、これを行うための汎用ライブラリ関数はありません。 Goには、スライスを操作できる関数を直接記述する方法がありません。
関数は機能しますが、range
を使用して記述した場合は少し改善されます。
バイトスライスがある場合、 bytes.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を返します。
そのためのライブラリ関数はありません。自分でコーディングする必要があります。
func index(slice []string, item string) int {
for i, _ := range slice {
if slice[i] == item {
return i
}
}
return -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 を参照してください
あなたが何をしているかに依存します。