स्लाइस में तत्व की स्थिति कैसे पता करें?


108

एक टुकड़ा में मौजूद तत्व की स्थिति कैसे निर्धारित करता है?

मुझे निम्नलिखित की तरह कुछ चाहिए:

type intSlice []int

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

2
तो, सवाल क्या है? कोड काम नहीं करता है?
newacct

8
मैं पूछ रहा था कि कोडर्स को खुद से ऐसे सामान्य कार्य क्यों लिखने चाहिए? मेरा मतलब है कि अगर मैं फ्लोट मूल्यों के लिए एक और फ़ंक्शन चाहता हूं तो मुझे इस फ़ंक्शन को कॉपी / पेस्ट करने के लिए मजबूर किया जाएगा। यह मेरे लिए अजीब लग रहा था। लेकिन Krzysztof Kowalczyk ने पहले ही जवाब दे दिया है कि ऐसा इसलिए है क्योंकि गोलंग में जेनरिक नहीं है।
ओसीरिल

क्या आपका टुकड़ा छांटा गया है?
dolmen

2
इस स्रोत का प्रयास करें: gobyexample.com/collection-functions
विक्टर

जवाबों:


70

क्षमा करें, ऐसा करने के लिए कोई सामान्य लाइब्रेरी फ़ंक्शन नहीं है। जाओ के पास एक फ़ंक्शन लिखने का एक सीधा आगे का तरीका नहीं है जो किसी भी स्लाइस पर काम कर सकता है।

आपका फ़ंक्शन काम करता है, हालांकि यह थोड़ा बेहतर होगा यदि आप इसका उपयोग करके लिखते हैं range

यदि आप एक बाइट टुकड़ा है, वहाँ बाइट्स हैIndexByte


3
मैं इवान से सहमत हूं। अतिरिक्त टिप्पणी: यह सिर्फ एक पूर्णांक जहां -1 इंगित करता है (bytes.IndexByte) की तरह "नहीं मिला" वापस जाने के लिए और अधिक मुहावरेदार है
करज़िस्तोफ Kowalczyk

2
धन्यवाद। लेकिन मैं थोड़ा अभिभूत हूं :) मैंने गोलंग का उपयोग करने वाले लोगों से कई बार सुना, कि यह प्रोग्रामर की उत्पादकता बढ़ाने के लिए बहुत अच्छी तरह से डिज़ाइन किया गया है। और जाने के कार्यक्रमों के रूप में अजगर लोगों के रूप में अच्छा लग रहा है :) तो क्यों वहाँ इस तरह के एक आम काम करने के लिए कोई रास्ता नहीं है? मेरा मतलब है, अगर आप जांचना चाहते हैं कि क्या कंटेनर में एक तत्व है जो आप कर सकते हैंif element in collection: do_something()
OCyril

10
तकनीकी उत्तर है: क्योंकि गो में जेनरिक नहीं है। अगर यह किया (और शायद भविष्य में कुछ बिंदु पर यह उनके पास होगा) तो आप एक सामान्य इंडेक्सइन्स्लिस लिख सकते थे जो किसी भी प्रकार पर काम करता है जो == लागू करता है। मेरी गो एडवोकेट टोपी लगाना: यह एक औसत अनुभव के बारे में है। आप हर पहलू में हर दूसरी भाषा को हराने के लिए एक ही भाषा की उम्मीद नहीं कर सकते। गो C, C ++, शायद जावा या C # की तुलना में बहुत अधिक उत्पादक है और अजगर के करीब है। यह प्रोग्रामर उत्पादकता और देशी कोड पीढ़ी (यानी गति) का संयोजन है जो इसे आकर्षक बनाता है।
Krzysztof Kowalczyk 21

1
एक अन्य विकल्प सामान्य कार्यों के निर्माण के लिए उच्च आदेश कार्यों और क्लोजर का उपयोग करना है। मैंने एक उदाहरण के साथ उत्तर जोड़ा।
होडाज़

1
@OCyril आपको अपनी खुद की जेनेरिक लिखनी होगी और अपनी खुद की लाइब्रेरी बनानी होगी या रिसर्च करनी होगी और कुछ ऐसा ढूंढना होगा जो आपकी जरूरतों को पूरा करे। निम्नतम स्तर पर 'फाइंड वैल्यू = x इन एरे' फंक्शन (PHP, Python या जो भी हो) कुछ हद तक ओपी के प्रश्न में दिए गए संस्करण की तरह दिखेगा - एक निम्न स्तर पर। लूप्स इस तरह की प्रोग्रामिंग के लिए केंद्रीय हैं, भले ही वे छिपे हों। गो इस सामान को छिपाए नहीं।
इयान लुईस

54

आप मुहावरेदार तरीके से सामान्य कार्य बना सकते हैं:

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

1
इसे प्यार करो, लेकिन मुझे इस तरह से सोचना मुश्किल लगता है
डेसबल

1
मुझे नहीं लगता कि -1किसी त्रुटि के लिए वापस आना मुहावरेदार है, इसके बजाय एकाधिक रिटर्न का उपयोग करना चाहिए। (मैं गोलंग के लिए नया हूं लेकिन यही मैंने पढ़ा है)
टिम एबेल

7
Buildtin इंडेक्स फंक हमेशा -1 रिटर्न में जाता है। यह मुहावरेदार व्यवहार है। गुम तत्व कोई त्रुटि नहीं है।
होडाज़

यह शानदार है! बहुत उपयोगी :) धन्यवाद!
गौरव ओझा

12

आप एक फ़ंक्शन लिख सकते हैं;

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

यदि यह तत्व से मेल खाता है, तो यह वर्ण / स्ट्रिंग के सूचकांक को लौटाता है। अगर इसकी नहीं मिली, तो रिटर्न -1


6

उसके लिए कोई लाइब्रेरी फंक्शन नहीं है। आपको अपने हिसाब से कोड करना होगा।


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

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 देखें

हालांकि आप क्या कर रहे हैं पर निर्भर करता है।


ठीक है धन्यवाद। लेकिन मुझे लगता है कि इसका उपयोग करना अजीब लगता है अगर मैं केवल यह जांचना चाहता हूं कि क्या स्लाइस में तत्व मौजूद है :)
OCyril

3
यह मूल सूचकांक नहीं खोजता है; बल्कि यह उन्हें फिर से आदेश देकर सभी अनुक्रमित खो देता है
newacct

यकीन है, इसलिए यह उपयोग पर निर्भर करता है। यदि यह सिर्फ एक जांच है, तो सुनिश्चित करें, बस उपयोग करें for p, v := range ...और if। बस विकल्प को इंगित करना चाहता था।
रोबोथोर
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.