সুইফটে তালিকা আইটেমের সূচকটি কীভাবে খুঁজে পাবেন?


443

আমি একটি item indexঅনুসন্ধান করে একটি সন্ধান করার চেষ্টা করছি list। কেহ যে কিভাবে করবেন জানেন না?

আমি দেখতে পেয়েছি list.StartIndexএবং list.EndIndexতবে আমি পাইথনের মতো কিছু চাই list.index("text")

উত্তর:


823

যেহেতু সুইফট কিছুটা অবজেক্ট-ওরিয়েন্টেডের চেয়ে বেশি কার্যকরী হয় (এবং অ্যারেগুলি স্ট্রাক্ট হয়, অবজেক্ট নয়), অ্যারেতে কাজ করতে "সন্ধান করুন" ফাংশনটি ব্যবহার করে, যা একটি alচ্ছিক মান দেয়, তাই শূন্য মানটি হ্যান্ডেল করার জন্য প্রস্তুত থাকুন:

let arr:Array = ["a","b","c"]
find(arr, "c")!              // 2
find(arr, "d")               // nil

সুইফট ২.০ এর জন্য আপডেট:

পুরানো findফাংশনটি আর সুইফট ২.০ সহ সমর্থিত নয়!

সুইফট ২.০ সহ, (যা প্রয়োগ করে) এর Arrayএকটি এক্সটেনশনে সংজ্ঞায়িত একটি ফাংশন ব্যবহার করে কোনও উপাদানটির সূচক সন্ধান করার ক্ষমতা অর্জন করে :CollectionTypeArray

let arr = ["a","b","c"]

let indexOfA = arr.indexOf("a") // 0
let indexOfB = arr.indexOf("b") // 1
let indexOfD = arr.indexOf("d") // nil

অতিরিক্তভাবে, একটি প্রাকটিকাকে পূরণকারী অ্যারেতে প্রথম উপাদান সন্ধান করা এর অন্য এক্সটেনশন দ্বারা সমর্থিত CollectionType:

let arr2 = [1,2,3,4,5,6,7,8,9,10]
let indexOfFirstGreaterThanFive = arr2.indexOf({$0 > 5}) // 5
let indexOfFirstGreaterThanOneHundred = arr2.indexOf({$0 > 100}) // nil

নোট করুন যে এই দুটি ফাংশন পূর্বের মতো optionচ্ছিক মানগুলি ফেরত দেয় find

সুইফট 3.0 এর জন্য আপডেট:

নোট করুন সূচিপত্রের সিনট্যাক্সটি পরিবর্তিত হয়েছে। Equatableআপনার অনুসারে আইটেমগুলি ব্যবহার করতে পারেন:

let indexOfA = arr.index(of: "a")

পদ্ধতির বিস্তারিত ডকুমেন্টেশন https://developer.apple.com/references/swift/array/1689674-index এ পাওয়া যাবে

অ্যারে আইটেমগুলির সাথে খাপ খায় না এমনগুলির জন্য Equatableআপনাকে ব্যবহার করতে হবে index(where:):

let index = cells.index(where: { (item) -> Bool in
  item.foo == 42 // test if this is the item you're looking for
})

সুইফট 4.2 এর জন্য আপডেট:

সুইফট 4.2 দিয়ে, indexআর ব্যবহৃত হয় কিন্তু বিভক্ত করা হয় firstIndexএবং lastIndexভাল শোধন জন্য। সুতরাং আপনি আইটেমের প্রথম বা শেষ সূচকের সন্ধান করছেন কিনা তার উপর নির্ভর করে:

let arr = ["a","b","c","a"]

let indexOfA = arr.firstIndex(of: "a") // 0
let indexOfB = arr.lastIndex(of: "a") // 3

22
আপনি ফাংশনটি সম্পর্কে কোথায় শিখলেন? আমি "সন্ধান" বা অন্য কোনও বৈশ্বিক ক্রিয়াকলাপের কোনও দলিল খুঁজে পাচ্ছি না
জোহানেস

14
ওওপি বিশ্ব থেকে আগত, আমার কীভাবে এই জাতীয় ফ্লোটিং ফাংশনগুলি খুঁজে পাওয়ার কথা?
রুডল্ফ আদমকোভিč

4
এগুলি বেশিরভাগই অননুমোদিত বলে মনে হচ্ছে। একটি তালিকার জন্য প্র্যাকটিকসইউইফট ২৪.০৪/ ২০১ //১ //২ দেখুন (তবে সচেতন থাকুন যে আমি তালিকাটি সম্পূর্ণ বা আপ টু ডেট কিনা তা পরীক্ষা করে দেখিনি)।
সেবাস্তিয়ান শোথ

5
জোহানেস এবং @ রুডল্ফ - ড্যাশ.অ্যাপ ব্যবহার করুন। ব্রাউজিং ডকুমেন্টেশনের জন্য এটি একটি ওএস এক্স অ্যাপ। এটিতে সুইফটের জন্য একটি ভাষা রেফারেন্স রয়েছে যাতে সমস্ত ফ্লোটিং ফাংশনগুলির তালিকা রয়েছে। ফিল্টার এবং অনুসন্ধান করা সহজ। তা ছাড়া বাঁচতে পারি না।
17:25 '

4
এফওয়াইআই: আপনি যদি indexOfনিজেকে সংজ্ঞায়িত করে থাকেন তবে আপনার স্ট্রাক্ট Equatableপ্রোটোকলটি মেনে চলতে হবে ।
ম্যাথু কুইরোস

202

TL; ড:

ক্লাসগুলির জন্য, আপনি খুঁজছেন হতে পারে:

let index = someArray.firstIndex{$0 === someObject}

পুরো উত্তর:

আমি মনে করি এটি উল্লেখযোগ্য যে রেফারেন্স প্রকারের সাথে ( class) আপনি একটি পরিচয় তুলনা করতে চাইতে পারেন , সেক্ষেত্রে আপনাকে কেবল ===পরিচয় অপারেটরটি ভবিষ্যদ্বাণীীয় বন্ধে ব্যবহার করতে হবে :


সুইফট 5, সুইফট 4.2:

let person1 = Person(name: "John")
let person2 = Person(name: "Sue")
let person3 = Person(name: "Maria")
let person4 = Person(name: "Loner")

let people = [person1, person2, person3]

let indexOfPerson1 = people.firstIndex{$0 === person1} // 0
let indexOfPerson2 = people.firstIndex{$0 === person2} // 1
let indexOfPerson3 = people.firstIndex{$0 === person3} // 2
let indexOfPerson4 = people.firstIndex{$0 === person4} // nil

নোট করুন যে উপরের সিনট্যাক্সটি ট্রেলিং ক্লোজার্স সিনট্যাক্স ব্যবহার করে এবং এর সমতুল্য:

let indexOfPerson1 = people.firstIndex(where: {$0 === person1})


সুইফট 4 / সুইফট 3 - ফাংশনটি বলা হত index

সুইফট 2 - ফাংশনটি বলা হত indexOf

* প্রাসঙ্গিক ও দ্রষ্টব্য মন্তব্য দ্বারা paulbailey সম্পর্কে classযে বাস্তবায়ন ধরনের Equatable, যেখানে আপনি কিনা আপনি ব্যবহার তুলনা করা উচিত বিবেচনা করতে হবে ===( পরিচয় অপারেটর) অথবা ==( সমতা অপারেটর)। যদি আপনি ব্যবহার করে মিলে যাওয়ার সিদ্ধান্ত নেন ==, তবে আপনি কেবল অন্যদের পরামর্শ দেওয়া পদ্ধতিটি ব্যবহার করতে পারেন ( people.firstIndex(of: person1))।


6
যারা .indexOf (x) কাজ করে না কেন ভাবছেন তাদের জন্য এটি একটি দরকারী পোস্ট this এই সমাধানটি অপ্রত্যাশিত তবে পুরোপুরি প্রত্যক্ষদৃষ্টিতে পুরোপুরি স্পষ্ট।
মরি মারকোভিটস

1
এই জন্য আপনাকে অনেক ধন্যবাদ কিন্তু এটি আমার কাছে মোটেই সুস্পষ্ট নয়। আমি ডকুমেন্টেশনের দিকে নজর রেখেছি এবং আমি সত্যিই বুঝতে পারি না কেন রেফারেন্স টাইপের ইনডেক্সফ ব্যবহার করার সময় কেন আমার প্রিকিটিক বন্ধের প্রয়োজন হবে? এটি দেখে মনে হয় যে সূচকগুলি ইতিমধ্যে তার নিজের মতো করে রেফারেন্স প্রকারগুলি পরিচালনা করতে সক্ষম হবে। এটি জানা উচিত যে এটি একটি রেফারেন্স টাইপ এবং কোনও মান ধরণের নয়।
ক্রিস

7
যদি Personবাস্তবায়িত Equatableপ্রোটোকল, এই প্রয়োজন না করা হবে।
পলবাইলি

2
আমি গ্রহণ করছি: Binary operator '===' cannot be applied to operands of type '_' and 'Post', Postআমার struct হয় হচ্ছে ... তোর কোন সমস্যা?
ডেভিড

@ ডেভিডসাইক, structs(এবং enums) মান ধরণের, রেফারেন্স প্রকার নয়। শুধুমাত্র রেফারেন্সের ধরণের (যেমন class) পরিচয়ের তুলনা যুক্তি ( ===) রয়েছে। কী করতে হবে তার জন্য অন্যান্য উত্তরগুলি পরীক্ষা করে দেখুন structs(মূলত আপনি কেবল এটি ব্যবহার করেন array.index(of: myStruct), নিশ্চিত ধরণের myStructকনফার্মগুলি তৈরি করে Equatable( ==))।
নিকোলে সুভান্দজিয়েভ

81

আপনি filterক্লোজার সহ একটি অ্যারে করতে পারেন :

var myList = [1, 2, 3, 4]
var filtered = myList.filter { $0 == 3 }  // <= returns [3]

এবং আপনি একটি অ্যারে গণনা করতে পারেন:

filtered.count // <= returns 1

সুতরাং আপনি নির্ধারণ করতে পারেন যদি একটি অ্যারের এই মিশ্রন দ্বারা আপনার উপাদান রয়েছে:

myList.filter { $0 == 3 }.count > 0  // <= returns true if the array includes 3

আপনি যদি অবস্থানটি সন্ধান করতে চান তবে আমি অভিনব উপায় দেখতে পাচ্ছি না তবে আপনি অবশ্যই এটি এটি করতে পারেন:

var found: Int?  // <= will hold the index if it was found, or else will be nil
for i in (0..x.count) {
    if x[i] == 3 {
        found = i
    }
}

সম্পাদনা

আমরা এটির সময়ে, একটি মজাদার অনুশীলনের জন্য আসুন Arrayএকটি findপদ্ধতি রাখি :

extension Array {
    func find(includedElement: T -> Bool) -> Int? {
        for (idx, element) in enumerate(self) {
            if includedElement(element) {
                return idx
            }
        }
        return nil
    }
}

এখন আমরা এটি করতে পারি:

myList.find { $0 == 3 }
// returns the index position of 3 or nil if not found

মজাদার জন্য আমি আরও একটি উদাহরণ যুক্ত করেছি যেখানে আমি বিল্টিনকে Arrayএমন একটি findপদ্ধতিতে প্রসারিত করেছি যা আপনি যা চান তা করে। আমি জানি না এটি একটি ভাল অনুশীলন কিনা, তবে এটি একটি ঝরঝরে পরীক্ষা।
gwcoffey

2
কেবল উল্লেখ করতে চাই যে ডকস অনুসারে আপনার ++ আইডিএক্স ব্যবহার করা উচিত: "যদি আপনার আই ++ এর নির্দিষ্ট আচরণের প্রয়োজন না হয় তবে আপনি সমস্ত ক্ষেত্রে ++ i এবং --i ব্যবহার করার পরামর্শ দেওয়া হয়, কারণ এগুলির সাধারণত প্রত্যাশিত প্রত্যাশা রয়েছে আমি সংশোধন এবং ফলাফল ফিরে আসার আচরণ। "
লোগান

ভাল কল. আপনি এটি পোস্ট করার সময় আমি এটি ব্যবহারের জন্য এটি সংশোধন করছিলাম enumerateযাতে এটি আর প্রযোজ্য না, তবে আপনি একেবারেই ঠিক।
gwcoffey

হ্যাঁ, আমি যখন উদাহরণটি দিয়ে যাচ্ছিলাম তার মধ্যে একটি উদাহরণে এটি লক্ষ্য করেছিলাম। নিজেকে এখন অভ্যাসে সেট করার চেষ্টা করছি :)
লোগান

4
এটি সুইফট 2 / এক্সকোড 7 এর অধীনে কাজ করার জন্য আপনাকে নীচে এটি পরিবর্তন করতে হবে। (অন্তর্ভুক্তকৃত উপাদান: টি -> বুল) এর সাথে (অন্তর্ভুক্ত উপাদান: উপাদান -> বুল) প্রতিস্থাপন করুন এবং গণনা (স্ব) কে সেলফি.আমুনারেটে পরিবর্তন করুন
স্কুটার 0

35

সুইফট 5

func firstIndex(of element: Element) -> Int?

var alphabets = ["A", "B", "E", "D"]

Example1

let index = alphabets.firstIndex(where: {$0 == "A"})

Example2

if let i = alphabets.firstIndex(of: "E") {
    alphabets[i] = "C" // i is the index
}
print(alphabets)
// Prints "["A", "B", "C", "D"]"

25

indexOf()পুরোপুরি কাজ করার সময় , এটি কেবল একটি সূচক দেয় returns

আমি উপাদানগুলির জন্য সূচকগুলির একটি অ্যারে পেতে একটি মার্জিত উপায় খুঁজছিলাম যা কিছু শর্ত পূরণ করে।

এটি কীভাবে করা যায় তা এখানে:

সুইফট 3:

let array = ["apple", "dog", "log"]

let indexes = array.enumerated().filter {
    $0.element.contains("og")
    }.map{$0.offset}

print(indexes)

সুইফট 2:

let array = ["apple", "dog", "log"]

let indexes = array.enumerate().filter {
    $0.element.containsString("og")
    }.map{$0.index}

print(indexes)

12

কাস্টম শ্রেণীর জন্য আপনার সমতুল্য প্রোটোকলটি প্রয়োগ করতে হবে।

import Foundation

func ==(l: MyClass, r: MyClass) -> Bool {
  return l.id == r.id
}

class MyClass: Equtable {
    init(id: String) {
        self.msgID = id
    }

    let msgID: String
}

let item = MyClass(3)
let itemList = [MyClass(1), MyClass(2), item]
let idx = itemList.indexOf(item)

printl(idx)

9

সুইফট 2 এর জন্য আপডেট:

সিকোয়েন্স। কনটেনস (উপাদান) : প্রদত্ত অনুক্রম (যেমন একটি অ্যারে) নির্দিষ্ট উপাদান অন্তর্ভুক্ত করা হলে সত্যটি প্রত্যাবর্তন করে।

সুইফট 1:

যদি আপনি কেবল অ্যারের ভিতরে কোনও উপাদান রয়েছে কিনা তা খতিয়ে দেখতে খুঁজছেন, এটি হ'ল একটি বুলিয়ান সূচক পান, এর contains(sequence, element)পরিবর্তে ব্যবহার করুন find(array, element):

রয়েছে (ক্রম, উপাদান) : যদি প্রদত্ত অনুক্রম (যেমন একটি অ্যারে) নির্দিষ্ট উপাদান থাকে তবে সত্যটি প্রত্যাবর্তন করে।

নীচে উদাহরণ দেখুন:

var languages = ["Swift", "Objective-C"]
contains(languages, "Swift") == true
contains(languages, "Java") == false
contains([29, 85, 42, 96, 75], 42) == true
if (contains(languages, "Swift")) {
  // Use contains in these cases, instead of find.   
}


6

সুইফট ৪. যদি আপনার অ্যারেতে [স্ট্রিং: যেকোনওজেক্ট] টাইপের উপাদান থাকে। সুতরাং উপাদান সূচী খুঁজে পেতে নীচের কোড ব্যবহার করুন

var array = [[String: AnyObject]]()// Save your data in array
let objectAtZero = array[0] // get first object
let index = (self.array as NSArray).index(of: objectAtZero)

অথবা আপনি যদি অভিধান থেকে কী এর ভিত্তিতে সূচকটি পেতে চান। এখানে অ্যারেতে মডেল ক্লাসের অবজেক্টস রয়েছে এবং আমি আইডি সংস্থার সাথে মিল করছি।

   let userId = 20
    if let index = array.index(where: { (dict) -> Bool in
           return dict.id == userId // Will found index of matched id
    }) {
    print("Index found")
    }
OR
      let storeId = Int(surveyCurrent.store_id) // Accessing model key value
      indexArrUpTo = self.arrEarnUpTo.index { Int($0.store_id) == storeId }! // Array contains models and finding specific one

4

সুইফট 2.1

var array = ["0","1","2","3"]

if let index = array.indexOf("1") {
   array.removeAtIndex(index)
}

print(array) // ["0","2","3"]

সুইফট 3

var array = ["0","1","2","3"]

if let index = array.index(of: "1") {
    array.remove(at: index)
}
array.remove(at: 1)

3
আপনি একটি পরিবর্তন করছেন let array? এর ব্যবহারself প্রশ্নবিদ্ধ।
Chéyo

4

ইন সুইফট 4 , যদি আপনি আপনার DataModel অ্যারে মাধ্যমে ঢোঁড়ন হয়, Equatable প্রোটোকল নিশ্চিত আপনার ডেটা মডেল কে কনর্ফাম করে, LHS বাস্তবায়ন পদ্ধতি RHS করা =, এবং শুধুমাত্র তারপর আপনি ".index (এর" ব্যবহার করতে পারেন। উদাহরণস্বরূপ

class Photo : Equatable{
    var imageURL: URL?
    init(imageURL: URL){
        self.imageURL = imageURL
    }

    static func == (lhs: Photo, rhs: Photo) -> Bool{
        return lhs.imageURL == rhs.imageURL
    }
}

এবং তারপর,

let index = self.photos.index(of: aPhoto)

4

সুইফট 2 এ (এক্সকোড 7 Arrayসহ ), প্রোটোকল indexOfদ্বারা সরবরাহিত একটি পদ্ধতি অন্তর্ভুক্ত CollectionTypeকরে। (প্রকৃতপক্ষে, দুটি indexOfপদ্ধতি — একটি যা যুক্তির সাথে মেলে সাম্য ব্যবহার করে এবং অন্যটি একটি ক্লোজার ব্যবহার করে))

সুইফট 2 এর আগে সংগ্রহের মতো জেনেরিক ধরণের জন্য তাদের থেকে প্রাপ্ত কংক্রিটের ধরণের জন্য পদ্ধতি সরবরাহ করার উপায় ছিল না (অ্যারেগুলির মতো)। সুতরাং, সুইফট 1.x এ, "সূচক" হ'ল একটি গ্লোবাল ফাংশন ... এবং এটির নতুন নামকরণও হয়েছিল, তাই সুইফট 1.x এ, যেটিকে বিশ্বব্যাপী ফাংশন বলা হয় find

ফাউন্ডেশন indexOfObjectথেকে NSArray... বা অন্য যে কোনও একটি থেকে এই পদ্ধতিটি ব্যবহার করা সম্ভব (তবে প্রয়োজনীয় নয়) যা সুইফ্ট স্ট্যান্ডার্ড লাইব্রেরিতে সমতুল্য নয়। কেবল import Foundation(বা অন্য কোনও মডিউল যা অস্থায়ীভাবে ফাউন্ডেশন আমদানি করে), এতে আপনার কাস্ট Arrayকরে NSArray, এবং আপনি প্রচুর অনুসন্ধান পদ্ধতি ব্যবহার করতে পারেন NSArray


4

এই সমাধানের যে কোনওটি আমার পক্ষে কাজ করে

এই সমাধানটি আমার কাছে সুইফট 4 এর জন্য রয়েছে:

let monday = Day(name: "M")
let tuesday = Day(name: "T")
let friday = Day(name: "F")

let days = [monday, tuesday, friday]

let index = days.index(where: { 
            //important to test with === to be sure it's the same object reference
            $0 === tuesday
        })


2

আপনি যদি এখনও সুইফট 1.x এ কাজ করছেন

তারপরে চেষ্টা করুন,

let testArray = ["A","B","C"]

let indexOfA = find(testArray, "A") 
let indexOfB = find(testArray, "B")
let indexOfC = find(testArray, "C")

1

SWIFT 3 এর জন্য আপনি একটি সাধারণ ফাংশন ব্যবহার করতে পারেন

func find(objecToFind: String?) -> Int? {
   for i in 0...arrayName.count {
      if arrayName[i] == objectToFind {
         return i
      }
   }
return nil
}

এটি নম্বর পজিশন দেবে, যাতে আপনি পছন্দ মতো ব্যবহার করতে পারেন

arrayName.remove(at: (find(objecToFind))!)

আশা করি কাজে লাগবে


1

সুইফট 4

ধরা যাক যে আপনি অ্যারে থেকে কার্ডবটটন নামক কার্ডটি নাম্বারে একটি নম্বর সঞ্চয় করতে চান, আপনি এটি এইভাবে করতে পারেন:

let cardNumber = cardButtons.index(of: sender)

প্রেরক আপনার বোতামের নাম


0

সুইফট 4

রেফারেন্স ধরণের জন্য:

extension Array where Array.Element: AnyObject {

    func index(ofElement element: Element) -> Int? {
        for (currentIndex, currentElement) in self.enumerated() {
            if currentElement === element {
                return currentIndex
            }
        }
        return nil
    }
}


0

যদি কারও এই সমস্যা হয়

Cannot invoke initializer for type 'Int' with an argument list of type '(Array<Element>.Index?)'

এই কাজ

extension Int {
    var toInt: Int {
        return self
    }
}

তারপর

guard let finalIndex = index?.toInt else {
    return false
}

0

জন্য (>= swift 4.0)

এটা বরং খুব সহজ। নিম্নলিখিত Arrayবিষয় বিবেচনা করুন ।

var names: [String] = ["jack", "rose", "jill"]

উপাদানটির সূচক পেতে rose, আপনাকে যা করতে হবে তা হ'ল:

names.index(of: "rose") // returns 1

বিঃদ্রঃ:

  • Array.index(of:)একটি ফেরৎ Optional<Int>

  • nil বোঝায় যে উপাদান অ্যারে উপস্থিত নেই।

  • আপনি ফিরে আসা মানটি জোর-আন-মোড়ক করতে চাইতে পারেন বা if-letaroundচ্ছিকটি পেতে একটি ব্যবহার করতে পারেন।


0

শুধু ফার্স্ট ইন্ডেক্স পদ্ধতি ব্যবহার করুন।

array.firstIndex(where: { $0 == searchedItem })
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.