कैसे एक तत्व एक सरणी में है की जाँच करने के लिए कैसे


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
क्या यह माना जाता है कि अगर सरणी के अंदर प्रत्येक आइटम (और जिस आइटम को हम खोज रहे हैं) टाइप डिक्शनरी <स्ट्रींग, एनीऑक्जेक्ट> का है? उसे प्राप्त करने की कोशिश कर रहा हूं, लेकिन मुझे संकलन-समय त्रुटि मिलती है।
पिपलांचिका

7
@ppalancica: इसके लिए यह आवश्यक है कि सरणी तत्व Equatableप्रोटोकॉल के अनुरूप हों (जो Dictionary<String, AnyObject>नहीं है)। इसका एक दूसरा संस्करण है contains()जो एक विधेय लेता है ( stackoverflow.com/questions/29679486/… ) की तुलना में शायद आप इसका उपयोग कर सकते हैं, जैसेif contains(array, { $0 == dict } ) ...
मार्टिन आर

जेनेरिक सरणी से विशिष्ट तत्व की खोज कैसे करें? [AnyObject]
धवल एच। नीना

126

जो लोग यहां आए थे उनके लिए एक वस्तु ढूंढना और एक सरणी से वस्तु निकालना:

स्विफ्ट 1

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
हालांकि आप क्या इस्तेमाल कर रहे हैं, इसके आधार पर .contains अधिक सहज और यादगार महसूस कर सकते हैं
पिरिजन

4
क्या आप इसे तोड़कर अपने सिंटैक्स की व्याख्या कर सकते हैं? मैंने पहले कभी यह प्रारूपण नहीं देखा है और आपको एक ही बार में बहुत सारे उन्नत सामान मिल रहे हैं!
अग्रहरि

40

यदि आप यह देख रहे हैं कि किसी कस्टम वर्ग या संरचना की कोई आवृत्ति किसी सरणी में समाहित है, तो आपको अपने द्वारा उपयोग किए जाने वाले समान प्रोटोकॉल को लागू करना होगा .contains (myObject)।

उदाहरण के लिए:

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
}

मुझे फ़िल्टर समाधान पसंद है क्योंकि आप इसे सभी प्रकार की चीजों के लिए उपयोग कर सकते हैं। उदाहरण के लिए, मैं कुछ कोड को लूप कर रहा था, जिन्हें देखने पर यह जानने की कोशिश कर रहा था कि क्या किसी सूची में पहले से ही एक आइटम है जिसमें स्ट्रिंग मान है। यह स्विफ्ट में एक पंक्ति है, उस क्षेत्र पर एक फिल्टर का उपयोग करके।
मौर्य मार्कोविज

फ़िल्टर अक्षम है, क्योंकि यह हमेशा तत्व मिलने पर तुरंत लौटने के बजाय सभी तत्वों पर लूप करता है। इसके बजाय बेहतर उपयोग खोजें ()।
थोर्स्टन

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(जो सरणी संग्रह करने के लिए आसानी से उपलब्ध है) पहला तत्व विधेय को पूरा करने, whereafter सूचकांक के साथ इस्तेमाल किया जा सकता के सूचकांक को खोजने के लिए इस्तेमाल किया जा सकता 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: 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:) पद्धति जैसा कि @ डॉगफिश के उत्तर में दिखाया गया है। । यदि Personउदाहरण के ऊपर खोज-और-हटाने के दृष्टिकोण को लागू करना , हालांकि, index(where:)एक विधेय के साथ उपयोग करना उचित है (क्योंकि हम अब समानता के लिए परीक्षण नहीं करते हैं, लेकिन आपूर्ति की गई विधेय को पूरा करने के लिए)।


मैं एरे से फर्स्ट शुकलमेंट कैसे निकाल सकता हूं?
ixx86

@ i6x86 सवाल के लिए धन्यवाद। मैंने अपने उत्तर को तत्व को निकालने के तरीके के साथ अद्यतन किया (और यह भी कि हटाए गए तत्व को कैसे निकालें और कैप्चर करें)।
प्रातः

14

इसे पूरा करने का सबसे सरल तरीका सरणी पर फ़िल्टर का उपयोग करना है।

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

resultपाया तत्व होगा अगर यह मौजूद है और खाली रहेगा यदि तत्व मौजूद नहीं है। तो बस जाँच करें कि resultक्या खाली है आपको बताएगा कि तत्व सरणी में मौजूद है या नहीं। मैं निम्नलिखित का उपयोग करेगा:

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

महान समाधान। इसलिए यह विधि एक सरणी देता है। हालाँकि, मैं इसका उपयोग "id" देखने के लिए कर रहा हूँ। मेरे आवेदन में डी अद्वितीय हैं, इसलिए केवल एक परिणाम हो सकता है। क्या सिर्फ 1 परिणाम पर लौटने का एक तरीका है? मैं अब के लिए [0] परिणाम का उपयोग कर रहा हूं
Dan Beaulieu

3
@DanBeaulieu कुछ ऐसा करना 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

स्विफ्ट 2.1 के रूप में NSArrays का containsObjectउपयोग किया जा सकता है:

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

4
वास्तव में यह एक NSArray के लिए है। स्विफ्ट ऐरे नहीं
टाइको पांडेयार

हाँ, लेकिन आप अस्थायी रूप से अपने स्विफ्ट एरे को NSArray में बदल सकते हैं: यदि tempNSArrayForChecking = mySwiftArray को NSArray के रूप में बताएं? जहाँ tempNSArrayForChecking.containsObject (objectImCheckingFor) {// myArray में ऑब्जेक्ट है}
Vitalii

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

}

यदि आप NSObject क्लास का उपयोग तेजी से कर रहे हैं। यह चर मेरी आवश्यकता के अनुसार है। आप अपनी आवश्यकता के लिए संशोधित कर सकते हैं।

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

यह समान डेटा प्रकार के लिए है।

{ $0.user_id == cliectScreenSelectedObject.user_id }

अगर आप AnyObject टाइप करना चाहते हैं।

{ "\($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

Swift 4.2 +
आप आसानी से सत्यापित कर सकते हैं कि आपका उदाहरण एक सरणी है या नहीं निम्न फ़ंक्शन द्वारा।

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

   return false
}

यहां तक ​​कि आप इसे इस प्रकार एक्सेस कर सकते हैं। आप प्राप्त करेंगे nilअगर वस्तु एक सरणी नहीं होगी।

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

   return nil
}
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.