স্লাইসে উপাদান অবস্থানটি কীভাবে সন্ধান করবেন?


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
আমি জিজ্ঞাসা করছিলাম কোডাররা কেন নিজেরাই এই জাতীয় ফাংশন লিখবেন? মানে আমি যদি ভাসমান মানগুলির জন্য অন্য কোনও ফাংশন চাই তবে আমি এই ফাংশনটি অনুলিপি / পেস্ট করতে বাধ্য হব। এটি আমার কাছে অদ্ভুত লাগছিল। তবে ক্রজিৎসটোফ কোয়ালসিজিক ইতিমধ্যে জবাব দিয়ে গেছেন, গোলংয়ের জেনারিক নেই বলেই এটি।
ওসিরিল

আপনার স্লাইস সাজানো হয়?
ডলম্যান

2
এই উত্সটি ব্যবহার করে দেখুন: gobyexample.com/collection-funifications
ভিক্টর

উত্তর:


70

দুঃখিত, এটি করার মতো কোনও জেনেরিক লাইব্রেরি ফাংশন নেই। গোতে কোনও ফাংশন লেখার সোজা ফরোয়ার্ড পদ্ধতি নেই যা কোনও স্লাইসে চালিত করতে পারে।

তোমার ফাংশন কাজ, যদিও এটা একটু ভাল হবে যদি আপনি এটি ব্যবহার লিখেছিলেন range

আপনার যদি বাইট স্লাইস হয়ে থাকে তবে সেখানে বাইট রয়েছে nd ইন্ডেক্সবাইট


3
আমি ইভানের সাথে একমত অতিরিক্ত মন্তব্য: এটি কেবলমাত্র এমন একটি ফিরে আসা আরও বুদ্ধিমানের যেখানে -1 ইঙ্গিত "পাওয়া যায় না" (বাইটস.আইডেক্সবাইটের মতো)
ক্রিজিসটফ

2
ধন্যবাদ। তবে আমি কিছুটা অভিভূত হয়েছি :) আমি গোলং ব্যবহার করা লোকদের কাছ থেকে বহুবার শুনেছি, প্রোগ্রামারের উত্পাদনশীলতা বাড়াতে এটি খুব ভালভাবে ডিজাইন করা হয়েছে। এবং গো প্রোগ্রামগুলি অজগরগুলির মতো দুর্দান্ত দেখায় :) তবে কেন এমন সাধারণ কাজ করার কোনও সাধারণ উপায় নেই? আমি বলতে চাইছি, আপনি যদি if element in collection: do_something()
ধারকটির

10
প্রযুক্তিগত উত্তরটি হ'ল: কারণ গো জেনেরিকস নেই। যদি এটি হয়ে থাকে (এবং ভবিষ্যতে হয়তো এটি তাদের কাছে থাকবে) আপনি জেনেরিক ইনডেক্সইনস্লাইস লিখতে পারতেন যা যে কোনও ধরণের প্রয়োগ করে == প্রয়োগ করে। আমার গো অ্যাডভোকেট টুপি লাগানো: এটি প্রায় গড় অভিজ্ঞতা। আপনি আশা করতে পারবেন না যে কোনও একটি ভাষাই প্রতিটি দিক থেকে প্রতিটি ভাষাকে পরাজিত করবে। যান হয় অনেক সি, সি ++ এমনকি জাভা বা C # এবং পাইথন পাসে চেয়ে বেশি। এটি প্রোগ্রামার উত্পাদনশীলতা এবং নেটিভ কোড জেনারেশন (অর্থাত গতি) এর সংমিশ্রণ যা এটিকে আকর্ষণীয় করে তোলে।
Krzysztof Kowalczyk

1
আর একটি বিকল্প হ'ল জেনেরিক ফাংশন তৈরির জন্য উচ্চতর অর্ডার ফাংশন এবং ক্লোজারগুলি ব্যবহার করা। আমি একটি উদাহরণ সহ উত্তর যুক্ত।
হোডজা

1
@ ওসিরিল আপনাকে নিজের জেনেরিক লিখতে হবে এবং নিজের লাইব্রেরি তৈরি করতে হবে বা গবেষণা করতে হবে এবং এমন কিছু সন্ধান করতে হবে যা আপনার প্রয়োজনের সাথে খাপ খায়। সর্বনিম্ন স্তরে 'সন্ধানের মান = এক্স এ অ্যারে' ফাংশন (পিএইচপি, পাইথন বা যাই হোক না কেন) কিছুটা ওপি-র প্রশ্নের বর্ণিত সংস্করণের মতো দেখাবে - একটি নিম্ন স্তরে। লুপগুলি লুকানো থাকলেও এই জাতীয় প্রোগ্রামিংয়ের কেন্দ্রবিন্দু। গো এই জিনিসগুলি গোপন করে না।
ইয়ান লুইস

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
এই প্রেম, কিন্তু আমি এটি হার্ড এই ভাবে মনে আসতে খুঁজে না
Decebal

1
আমি মনে করি না যে -1কোনও ত্রুটির জন্য ফিরে আসা idiomatic, পরিবর্তে এটি একাধিক রিটার্ন ব্যবহার করা উচিত। (আমি গোলাং-এ নতুন তবে আমি এটি পড়েছি)
টিম

7
বিল্টটিন ইনডেক্স ফুনকস সর্বদা ফিরে যান -1। এটি প্রত্যাশিত আচরণমূলক আচরণ। অনুপস্থিত উপাদান ত্রুটি নয়।
হোডজা

এটি চমৎকার! খুব দরকারী :) ধন্যবাদ!
গৌরব ওঝা

12

আপনি একটি ফাংশন লিখতে পারে;

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

এটি একটি অক্ষর / স্ট্রিংয়ের সূচকটি যদি উপাদানটির সাথে মেলে returns যদি এটি না পাওয়া যায় তবে একটি -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 দেখুন

আপনি যদিও করছেন তার উপর নির্ভর করে।


ঠিক আছে ধন্যবাদ. তবে আমি অনুমান করি যে এটি ব্যবহার করা অদ্ভুত বলে মনে হচ্ছে যদি আমি কেবল
এটিই

3
এটি মূল সূচকটি খুঁজে পায় না; পরিবর্তে এটি সমস্ত সূচকগুলি পুনরায় অর্ডার দিয়ে
হারাতে

অবশ্যই, এটি ব্যবহারের উপর নির্ভর করে। যদি এটি কেবল একটি চেক হয় তবে অবশ্যই, কেবল ব্যবহার করুন for p, v := range ...এবং if। কেবল বিকল্পটি নির্দেশ করতে চেয়েছিল।
রোবথর
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.