কোনও উপাদান অ্যারেতে রয়েছে কিনা তা কীভাবে পরীক্ষা করবেন


475

সুইফটে, আমি কীভাবে পরীক্ষা করতে পারি যে কোনও অ্যারেরে একটি উপাদান রয়েছে কিনা? Xcode জন্য কোন পরামর্শ আছে না contain, includeঅথবা has, এবং বই মাধ্যমে একটি দ্রুত অনুসন্ধান কিছুই পরিণত আপ। এই জন্য চেক কিভাবে কোন ধারণা? আমি জানি যে এমন একটি পদ্ধতি আছে যা findসূচক সংখ্যাটি ফেরত দেয়, তবে কি এমন কোনও পদ্ধতি আছে যা রুবির মতো বুলিয়ান ফেরায় #include??

আমার যা প্রয়োজন তার উদাহরণ:

var elements = [1,2,3,4,5]
if elements.contains(5) {
  //do something
}

11
if find(elements, 5) != nil { }যথেষ্ট ভাল না?
মার্টিন আর

1
আমি আরও পরিষ্কার কিছু আশা করছিলাম তবে এটি ভাল দেখাচ্ছে না। ডকুমেন্টেশন বা বইটিতে আমি এখনও কিছু খুঁজে পাইনি।
জারেডস্মিথ

উত্তর:


860

সুইফট 2, 3, 4, 5:

let elements = [1, 2, 3, 4, 5]
if elements.contains(5) {
    print("yes")
}

contains()( উপাদানগুলির ক্রমগুলির জন্য ) এর একটি প্রোটোকল এক্সটেনশন পদ্ধতি এবং পূর্ববর্তী প্রকাশের মতো কোনও বৈশ্বিক পদ্ধতি নয়।SequenceTypeEquatable

মন্তব্য:

পুরানো সংস্করণ পরিবর্তন করুন:

let elements = [1,2,3,4,5]
if contains(elements, 5) {
    println("yes")
}

4
এই জাতীয় বৈশ্বিক ফাংশন সম্পর্কে কোনও ডকুমেন্টেশন?
রিভেরা

3
অ্যারের ভিতরে থাকা প্রতিটি আইটেমটি (এবং আমরা যে আইটেমটির সন্ধান করছি) অভিধান <স্ট্রিং, যেকোনওজেক্ট> টাইপ করে কাজ করা উচিত? এটি অর্জনের চেষ্টা করছি তবে আমি সংকলন-সময় ত্রুটি পেয়েছি।
ppalancica

7
@ অ্যাপল্যান্সিকা: এটির জন্য অ্যারের উপাদানগুলি Equatableপ্রোটোকলের সাথে খাপ খাইয়ে নেওয়া প্রয়োজন (যা Dictionary<String, AnyObject>হয় না)। এর একটি দ্বিতীয় রূপ রয়েছে contains()যার একটি প্রাকটিক লাগে (তুলনা করুন স্ট্যাকওভারফ্লো.com/ প্রশ্নগুলি / 29679486/… ) সম্ভবত আপনি এটি ব্যবহার করতে পারেন, যেমনif contains(array, { $0 == dict } ) ...
মার্টিন আর

জেনেরিক অ্যারে থেকে নির্দিষ্ট উপাদান কীভাবে সন্ধান করবেন? [যে কোনও অবজেক্ট] বলুন?
ধাওয়াল এইচ। নেনা

126

যারা এখানে এসেছেন তাদের জন্য এবং এটি থেকে একটি অ্যারের থেকে কোনও সামগ্রী সন্ধান করুন:

সুইফট ঘ

if let index = find(itemList, item) {
    itemList.removeAtIndex(index)
}

সুইফট 2

if let index = itemList.indexOf(item) {
    itemList.removeAtIndex(index)
}

সুইফট 3, 4, 5

if let index = itemList.index(of: item) {
    itemList.remove(at: index)
}

3
প্রশ্নের সাথে সম্পর্কিত উত্তর দিন। এই প্রশ্নটি অ্যারেতে কোনও উপাদান সন্ধান করার বিষয়ে জিজ্ঞাসা করে, এটি অপসারণ বা আপডেট করে না। আপনি একটি পৃথক প্রশ্ন উত্থাপন করতে পারেন এবং নিজের উত্তরও দিতে পারেন।
তেজাস

60

এই এক্সটেনশনটি ব্যবহার করুন:

extension Array {
    func contains<T where T : Equatable>(obj: T) -> Bool {
        return self.filter({$0 as? T == obj}).count > 0
    }
}

ব্যবহৃত হচ্ছে:

array.contains(1)

সুইফট 2/3 এর জন্য আপডেট হয়েছে

নোট করুন যে সুইফট 3 (বা এমনকি 2) হিসাবে, এক্সটেনশনটির আর প্রয়োজন নেই কারণ গ্লোবাল containsফাংশনটি এক্সটেনশন পদ্ধতির একজোড়া তৈরি করা হয়েছে Array, যা আপনাকে উভয়ের মধ্যে যা করতে দেয়:

let a = [ 1, 2, 3, 4 ]

a.contains(2)           // => true, only usable if Element : Equatable

a.contains { $0 < 1 }   // => false

10
খুঁজে দ্রুত।
জিম বাল্টার

1
যদিও আপনি অভ্যস্ত ছিলেন তার উপর নির্ভর করে, নিয়ন্ত্রণগুলি আরও স্বজ্ঞাত এবং স্মরণীয় বোধ করতে পারে
পিরিজান

4
আপনার সিনট্যাক্সটি ভেঙে দিয়ে ব্যাখ্যা করতে পারবেন? আমি এই ফর্ম্যাটিং এর আগে কখনও দেখিনি এবং আপনি অনেক উন্নত জিনিস একবারে ঘটতে পেয়েছেন!
আগ্রাসক

40

যদি আপনি যাচাই করে থাকেন যে কোনও কাস্টম শ্রেণি বা স্ট্রাক্টের কোনও উদাহরণ কোনও অ্যারেতে রয়েছে কিনা, আপনি .Contains (মাইবজেক্ট) ব্যবহার করার আগে আপনাকে সমতুল্য প্রোটোকলটি প্রয়োগ করতে হবে।

উদাহরণ স্বরূপ:

struct Cup: Equatable {
    let filled:Bool
}

static func ==(lhs:Cup, rhs:Cup) -> Bool { // Implement Equatable
    return lhs.filled == rhs.filled
}

তাহলে আপনি এটি করতে পারেন:

cupArray.contains(myCup)

টিপ : == ওভাররাইডটি আপনার শ্রেণী / কাঠামোর মধ্যে নয়, বিশ্বব্যাপী স্তরে হওয়া উচিত


32

আমি ফিল্টার ব্যবহার করেছি।

let results = elements.filter { el in el == 5 }
if results.count > 0 {
    // any matching items are in results
} else {
    // not found
}

আপনি যদি চান, আপনি এটি সংকোচন করতে পারেন

if elements.filter({ el in el == 5 }).count > 0 {
}

আশা করি এইটি কাজ করবে.


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

ডিফল্ট বাস্তবায়নের জন্য হুররে!

if elements.contains(5) {
    // any matching items are in results
} else {
    // not found
}

আমি ফিল্টার সমাধানটি পছন্দ করি কারণ আপনি এটি সমস্ত ধরণের জন্য ব্যবহার করতে পারেন। উদাহরণস্বরূপ, আমি এমন কিছু কোড পোর্টিং করছিলাম যা লুপ করা এবং লুপ করে দেখার চেষ্টা করছিল যে তালিকায় ইতিমধ্যে এর কোনও একটি ক্ষেত্রের সাথে একটি স্ট্রিংয়ের মান রয়েছে কিনা to এটি ফিল্ডের একটি ফিল্টার ব্যবহার করে এটি সুইফটে একটি লাইন
মৌরি মার্কোভিটস

ফিল্টারটি অকার্যকর কারণ যখন উপাদানটি পাওয়া যায় তখন তা তাত্ক্ষণিকভাবে ফিরে আসার পরিবর্তে সব উপাদানকে ঘিরে ফেলে। পরিবর্তে আরও ভাল ব্যবহার করুন ()।
থারস্টেন

19

(সুইফট 3)

অ্যারেতে কোনও উপাদান উপস্থিত রয়েছে কিনা তা পরীক্ষা করুন (কিছু মানদণ্ড পূরণ করছে ) এবং যদি তা হয় তবে এই জাতীয় উপাদানটির সাথে প্রথম কাজ করে যান

উদ্দেশ্যটি হ'ল:

  1. অ্যারেতে উপাদান উপস্থিত রয়েছে কিনা তা পরীক্ষা করতে (/ কিছু বুলিয়ান মানদণ্ড পূরণ করে, সমতা পরীক্ষা করার প্রয়োজন হয় না),
  2. এবং যদি তা হয় তবে এগিয়ে যান এবং এই জাতীয় উপাদানের সাথে কাজ করুন,

তারপরে contains(_:)ব্লুপ্রিন্ট Sequenceকরা বিকল্পের first(where:)মধ্যে রয়েছে Sequence:

let elements = [1, 2, 3, 4, 5]

if let firstSuchElement = elements.first(where: { $0 == 4 }) {
    print(firstSuchElement) // 4
    // ...
}

এই দ্বন্দ্বযুক্ত উদাহরণে, এর ব্যবহারটি নির্বোধ বলে মনে হতে পারে তবে কোনও শর্ত পূরণকারী কোনও উপাদানের অস্তিত্বের জন্য অ-মৌলিক উপাদান ধরণের অ্যারেগুলি অনুসন্ধান করা যদি এটি খুব কার্যকর হয়। যেমন

struct Person {
    let age: Int
    let name: String
    init(_ age: Int, _ name: String) {
        self.age = age
        self.name = name
    }
}

let persons = [Person(17, "Fred"),   Person(16, "Susan"),
               Person(19, "Hannah"), Person(18, "Sarah"),
               Person(23, "Sam"),    Person(18, "Jane")]

if let eligableDriver = persons.first(where: { $0.age >= 18 }) {
    print("\(eligableDriver.name) can possibly drive the rental car in Sweden.")
    // ...
} // Hannah can possibly drive the rental car in Sweden.

let daniel = Person(18, "Daniel")
if let sameAgeAsDaniel = persons.first(where: { $0.age == daniel.age }) {
    print("\(sameAgeAsDaniel.name) is the same age as \(daniel.name).")
    // ...
} // Sarah is the same age as Daniel.

যে কোনও শিকলযুক্ত ক্রিয়াকলাপ ব্যবহার করে .filter { ... some condition }.firstঅনুকূলভাবে এটি প্রতিস্থাপন করা যেতে পারে first(where:)। পরেরটি আরও ভাল উদ্দেশ্য দেখায় এবং সম্ভাব্য অ-অলস সরঞ্জামগুলির তুলনায় পারফরম্যান্স সুবিধা রয়েছে .filterকারণ এগুলি ফিল্টারটি অতিক্রমকারী (সম্ভাব্য) প্রথম উপাদানটি বের করার পূর্বে সম্পূর্ণ অ্যারে পাস করবে।


অ্যারেতে কোনও উপাদান উপস্থিত রয়েছে কিনা তা পরীক্ষা করুন (কিছু মানদণ্ড পূরণ করছে) এবং যদি তা হয় তবে এই জাতীয় উপাদানটি প্রথম সরিয়ে দিন

প্রশ্নের নীচে একটি মন্তব্য:

firstSuchElementঅ্যারে থেকে আমি কীভাবে অপসারণ করতে পারি ?

উপরে বর্ণিত একটি অনুরূপ ব্যবহারের ক্ষেত্রে প্রথম উপাদানটিকে প্রদত্ত ভবিষ্যদ্বাণীকে পূরণ করে তা অপসারণ করা । এটি করার জন্য, index(where:)পদ্ধতিটি Collection(যা অ্যারে সংগ্রহের জন্য সহজেই উপলব্ধ) এর remove(at:)পদ্ধতিটি প্রাক্টিক্যালটি পূরণকারী প্রথম উপাদানটির সূচক খুঁজে পেতে ব্যবহার করা যেতে পারে, তারপরে সূচকটি ব্যবহারের পদ্ধতিটির সাথে ব্যবহার করা যেতে পারে Array(সম্ভাব্য; এটি উপস্থিত থাকা সত্ত্বেও ) যে উপাদান সরান।

var elements = ["a", "b", "c", "d", "e", "a", "b", "c"]

if let indexOfFirstSuchElement = elements.index(where: { $0 == "c" }) {
    elements.remove(at: indexOfFirstSuchElement)
    print(elements) // ["a", "b", "d", "e", "a", "b", "c"]
}

অথবা, যদি আপনি অ্যারে থেকে উপাদান মুছে ফেলার জন্য চাই এবং সঙ্গে কাজ আবেদন Optional: S map(_:)(জন্য শর্তসাপেক্ষে করতে পদ্ধতি .some(...)থেকে ফেরত index(where:)) থেকে ফলাফলের ব্যবহার index(where:)(একটি ঐচ্ছিক বাঁধাই দফা মধ্যে) অ্যারে থেকে মুছে ফেলার জন্য এবং ক্যাপচার সরানো উপাদান ।

var elements = ["a", "b", "c", "d", "e", "a", "b", "c"]

if let firstSuchElement = elements.index(where: { $0 == "c" })
    .map({ elements.remove(at: $0) }) {

    // if we enter here, the first such element have now been
    // remove from the array
    print(elements) // ["a", "b", "d", "e", "a", "b", "c"]

    // and we may work with it
    print(firstSuchElement) // c
}

নোট করুন যে অ্যারে সদস্যদের উপরে সংক্ষিপ্ত উদাহরণে সাধারণ মান ধরণের ( Stringউদাহরণ), সুতরাং কোনও প্রদত্ত সদস্যকে অনুসন্ধান করার জন্য একটি প্রাক্কলিত ব্যবহার করা কিছুটা বেশি মারাত্মক, কারণ আমরা কেবলমাত্র @ ডগকফির উত্তরেindex(of:) দেখানো সহজ পদ্ধতিটি ব্যবহার করে সাম্যের জন্য পরীক্ষা করতে পারি mightPersonউদাহরণস্বরূপ উপরোক্ত অনুসন্ধান ও অপসারণের পদ্ধতির প্রয়োগ করা হলে , তবে index(where:)একটি শিকারীর সাহায্যে ব্যবহার করা যথাযথ (যেহেতু আমরা আর সাম্যের জন্য পরীক্ষা করি না তবে সরবরাহকৃত ভবিষ্যদ্বাণী পূরণের জন্য)।


অ্যারে থেকে আমি কীভাবে ফার্স্টসুকলেট সরিয়ে ফেলব?
i6x86

@ i6x86 প্রশ্নের জন্য ধন্যবাদ। কীভাবে উপাদানটি সরিয়ে ফেলা যায় (এবং কীভাবে মুছে ফেলা উপাদানটিকে কীভাবে সরিয়ে ফেলতে হয়) তার উদাহরণ সহ আমি আমার উত্তর আপডেট করেছি।
dfri

14

এটি সম্পাদন করার সহজতম উপায় হ'ল অ্যারেতে ফিল্টার ব্যবহার করা।

let result = elements.filter { $0==5 }

resultযদি এটি বিদ্যমান থাকে তবে এটি পাওয়া যাবে এবং যদি উপাদানটির অস্তিত্ব না থাকে তবে খালি থাকবে। সুতরাং resultখালি কিনা তা খালি পরীক্ষা করা আপনাকে অ্যারের মধ্যে উপাদান উপস্থিত রয়েছে কিনা তা বলবে। আমি নিম্নলিখিত ব্যবহার করবে:

if result.isEmpty {
    // element does not exist in array
} else {
    // element exists
}

দুর্দান্ত সমাধান সুতরাং এই পদ্ধতিটি একটি অ্যারে প্রদান করে। তবে, আমি একটি "আইডি" সন্ধান করতে এটি ব্যবহার করছি using আমার অ্যাপ্লিকেশনটিতে ডিগুলি অনন্য, সুতরাং কেবলমাত্র একটি ফলাফল হতে পারে। মাত্র 1 ফলাফল ফেরার উপায় আছে কি? আমি আপাতত ফলাফল [0] ব্যবহার করছি
ড্যান বিউলিউ

3
@ ড্যানবিউলিউউ এমন কিছু করার ফলে let result = elements.filter { $0==5 }.firstআপনি যা খুঁজছেন তা সম্পূর্ণ করা উচিত।
davetw12

7

সুইফট 4/5

এটি অর্জনের আর একটি উপায় হ'ল ফিল্টার ফাংশন

var elements = [1,2,3,4,5]
if let object = elements.filter({ $0 == 5 }).first {
    print("found")
} else {
    print("not found")
}

6

সুইফট ২.১-এর মতো এনএসআরাইগুলির containsObjectমতো এটি ব্যবহার করা যেতে পারে:

if myArray.containsObject(objectImCheckingFor){
    //myArray has the objectImCheckingFor
}

4
আসলে এটি একটি এনএসআরির জন্য। একটি
তাত্ক্ষণিক

হ্যাঁ, তবে আপনি নিজের সুইফট অ্যারেটিকে অস্থায়ীভাবে এনএসআরে রূপান্তর করতে পারবেন: যদি টেম্পনারসআরএফরফেরচেকিং = মাইসুইফটআর্রে এনএসআর্রে হিসাবে দেওয়া হয়? যেখানে tempNSArrayForChecking.containsObject (অবজেক্টআইএমচেকিংফোর্ড) {// মাইআরাই এর অবজেক্ট রয়েছে}
ভিটালি

4

কেবলমাত্র যদি কেউ indexPathনির্বাচিত ব্যক্তিদের মধ্যে রয়েছে (যেমন কোনও UICollectionViewবা UITableView cellForItemAtIndexPathফাংশনগুলিতে) সন্ধান করার চেষ্টা করছে:

    var isSelectedItem = false
    if let selectedIndexPaths = collectionView.indexPathsForSelectedItems() as? [NSIndexPath]{
        if contains(selectedIndexPaths, indexPath) {
            isSelectedItem = true
        }
    }

4

বিন্যাস

let elements = [1, 2, 3, 4, 5, 5]

উপাদান উপস্থিতি পরীক্ষা করুন

elements.contains(5) // true

উপাদান সূচক পান

elements.firstIndex(of: 5) // 4
elements.firstIndex(of: 10) // nil

উপাদান গণনা পান

let results = elements.filter { element in element == 5 }
results.count // 2

3

এখানে আমার সামান্য সম্প্রসারণ আমি স্রেফ আমার ডেলিগেট অ্যারেতে একটি প্রতিনিধি বস্তু রয়েছে কিনা তা যাচাই করার জন্য লিখেছিলাম ( সুইফট 2 )। :) এটি একটি কবজ মত মান ধরণের সঙ্গে কাজ করে।

extension Array
{
    func containsObject(object: Any) -> Bool
    {
        if let anObject: AnyObject = object as? AnyObject
        {
            for obj in self
            {
                if let anObj: AnyObject = obj as? AnyObject
                {
                    if anObj === anObject { return true }
                }
            }
        }
        return false
    }
}

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


2

যদি ব্যবহারকারী নির্দিষ্ট অ্যারে উপাদানগুলি খুঁজে পান তবে নীচের কোডটি পূর্ণসংখ্যার মান হিসাবে ব্যবহার করুন।

var arrelemnts = ["sachin", "test", "test1", "test3"]

 if arrelemnts.contains("test"){
    print("found")   }else{
    print("not found")   }

2

দ্রুতগতি

আপনি যদি অবজেক্টটি ব্যবহার না করে থাকেন তবে আপনি এই কোডটি ধারণ করে ব্যবহার করতে পারেন।

let elements = [ 10, 20, 30, 40, 50]

if elements.contains(50) {

   print("true")

}

আপনি যদি সুইফটে এনএসবজেক্ট ক্লাস ব্যবহার করছেন। এই পরিবর্তনগুলি আমার প্রয়োজন অনুযায়ী হয়। আপনি আপনার প্রয়োজনের জন্য পরিবর্তন করতে পারেন।

var cliectScreenList = [ATModelLeadInfo]()
var cliectScreenSelectedObject: ATModelLeadInfo!

এটি একই ডেটা টাইপের জন্য।

{ $0.user_id == cliectScreenSelectedObject.user_id }

আপনি চাইলে যেকোনওবজেক্ট টাইপ করুন।

{ "\($0.user_id)" == "\(cliectScreenSelectedObject.user_id)" }

পুরো অবস্থা

if cliectScreenSelected.contains( { $0.user_id == cliectScreenSelectedObject.user_id } ) == false {

    cliectScreenSelected.append(cliectScreenSelectedObject)

    print("Object Added")

} else {

    print("Object already exists")

 }

1

কাজের জন্য হ্যাশ টেবিল ব্যবহার সম্পর্কে কী?

প্রথমে সিকোয়েন্স প্রোটোকল প্রসারিত করে একটি "হ্যাশ ম্যাপ" জেনেরিক ফাংশন তৈরি করা।

extension Sequence where Element: Hashable {

    func hashMap() -> [Element: Int] {
        var dict: [Element: Int] = [:]
        for (i, value) in self.enumerated() {
            dict[value] = i
        }
        return dict
    }
}

এই এক্সটেনশনটি যতক্ষণ কাজ করবে যতক্ষণ অ্যারের আইটেমগুলি হ্যাশেবলের সাথে সামঞ্জস্য করবে যেমন পূর্ণসংখ্যা বা স্ট্রিংয়ের মতো, এখানে ব্যবহার রয়েছে ...

let numbers = Array(0...50) 
let hashMappedNumbers = numbers.hashMap()

let numToDetect = 35

let indexOfnumToDetect = hashMappedNumbers[numToDetect] // returns the index of the item and if all the elements in the array are different, it will work to get the index of the object!

print(indexOfnumToDetect) // prints 35

তবে আপাতত, আসল উপাদান অ্যারেতে রয়েছে কিনা তা যাচাই করে ফোকাস করি।

let numExists = indexOfnumToDetect != nil // if the key does not exist 
means the number is not contained in the collection.

print(numExists) // prints true

0

সুইফট 4.2 +
আপনি নীচের ফাংশনটি দ্বারা সহজেই আপনার উদাহরণটি একটি অ্যারে কিনা তা যাচাই করতে পারেন।

func verifyIsObjectOfAnArray<T>(_ object: T) -> Bool {
   if let _ = object as? [T] {
      return true
   }

   return false
}

এমনকি আপনি নিম্নলিখিত হিসাবে এটি অ্যাক্সেস করতে পারেন। আপনি পাবেন nilযদি বস্তুটি অ্যারে না হয় receive

func verifyIsObjectOfAnArray<T>(_ object: T) -> [T]? {
   if let array = object as? [T] {
      return array
   }

   return nil
}
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.