स्विफ्ट में एरे से एक एलिमेंट को कैसे हटाएं


236

मैं Apple की नई भाषा स्विफ्ट में किसी ऐरे से किसी तत्व को कैसे हटा / हटा सकता हूँ?

यहाँ कुछ कोड है:

let animals = ["cats", "dogs", "chimps", "moose"]

तत्व animals[2]को सरणी से कैसे हटाया जा सकता है?

जवाबों:


300

letकीवर्ड स्थिरांक बदला नहीं जा सकता है कि घोषित करने के लिए है। यदि आप एक चर को संशोधित करना चाहते हैं, जिसका आपको उपयोग करना चाहिए var, जैसे:

var animals = ["cats", "dogs", "chimps", "moose"]

animals.remove(at: 2)  //["cats", "dogs", "moose"]

एक गैर-म्यूटिंग विकल्प जो मूल संग्रह को अपरिवर्तित रखेगा, filterआपके द्वारा हटाए गए तत्वों के बिना एक नया संग्रह बनाने के लिए उपयोग करना है, जैसे:

let pets = animals.filter { $0 != "chimps" }

7
FYI करें: removeहटाए गए तत्व को लौटाता है:let animal = animals.remove(at: 2)
2Toad

1
क्या हम केवल सूचकांक के आधार पर फ़िल्टर कर सकते हैं ??
शकीर सैय्यद

@shaqirsaiyed आप किसी भी विधेय पर फ़िल्टर कर सकते हैं जिसे आप सोच सकते हैं। उदाहरण के लिए आप सभी जानवरों को छान सकते हैं जो एक "एस" में समाप्त होते हैं।
Womble

जानवरों को जोड़ें = पालतू जानवर
Puji Wahono

197

दिया हुआ

var animals = ["cats", "dogs", "chimps", "moose"]

पहला तत्व निकालें

animals.removeFirst() // "cats"
print(animals)        // ["dogs", "chimps", "moose"]

अंतिम तत्व निकालें

animals.removeLast() // "moose"
print(animals)       // ["cats", "dogs", "chimps"]

सूचकांक में तत्व निकालें

animals.remove(at: 2) // "chimps"
print(animals)           // ["cats", "dogs", "moose"]

अज्ञात सूचकांक का तत्व निकालें

केवल एक तत्व के लिए

if let index = animals.firstIndex(of: "chimps") {
    animals.remove(at: index)
}
print(animals) // ["cats", "dogs", "moose"]

कई तत्वों के लिए

var animals = ["cats", "dogs", "chimps", "moose", "chimps"]

animals = animals.filter(){$0 != "chimps"}
print(animals) // ["cats", "dogs", "moose"]

टिप्पणियाँ

  • उपर्युक्त विधियाँ स्थान को छोड़कर (को छोड़कर filter) को संशोधित करती हैं और हटाए गए तत्व को वापस करती हैं।
  • गाइड गाइड टू मैप फ़िल्टर रिड्यूस
  • यदि आप मूल सरणी को संशोधित नहीं करना चाहते हैं, तो आप नए सरणी का उपयोग dropFirstया dropLastबना सकते हैं ।

स्विफ्ट 5.2 को अपडेट किया गया


इन उदाहरणों के लिए धन्यवाद, आप में अज्ञात तत्वों के तत्व को हटाएं > कई तत्वों के लिए , chimps && mooseउदाहरण के लिए हटाने के लिए आप क्या बंद लिखेंगे ? मैं कुछ अलग की तलाश कर रहा हूँ{$0 != "chimps" && $0 != "moose"}

161

उपरोक्त उत्तर लगता है कि आप उस तत्व के सूचकांक को जानते हैं जिसे आप हटाना चाहते हैं।

अक्सर आप उस ऑब्जेक्ट के संदर्भ को जानते हैं जिसे आप सरणी में हटाना चाहते हैं। (आपने अपने सरणी के माध्यम से पुनरावृत्ति की है और इसे पाया है, उदाहरण के लिए) ऐसे मामलों में वस्तु संदर्भ के साथ सीधे काम करना आसान हो सकता है, वह भी इसके सूचकांक में हर जगह से गुजरने के बिना। इसलिए, मैं इस समाधान का सुझाव देता हूं। यह पहचान ऑपरेटर का उपयोग करता है !==, जिसका उपयोग आप यह परखने के लिए करते हैं कि क्या दो ऑब्जेक्ट संदर्भ दोनों एक ही ऑब्जेक्ट उदाहरण को संदर्भित करते हैं।

func delete(element: String) {
    list = list.filter() { $0 !== element }
}

बेशक यह सिर्फ Stringएस के लिए काम नहीं करता है ।


23
होना चाहिएlist = list.filter({ $0 != element })
क्रेग ग्रुमिट सिप

5
नहीं अगर आप पहचान ऑपरेटर के साथ जांच करना चाहते हैं।
डैनियल

3
array.indexOf({ $0 == obj })
jrc

2
ध्यान दें कि यदि अन्य ऑब्जेक्ट listइस विलोपन को संदर्भित करते हैं तो आप अन्य ऐरे संदर्भों को अपडेट नहीं करेंगे क्योंकि आप एक नया एरे को असाइन कर रहे हैं list। यदि आप इस दृष्टिकोण के साथ सरणियों से हटाते हैं तो बस एक सूक्ष्म निहितार्थ है।
Crashalot

1
कार्यात्मक प्रोग्रामिंग प्रतिमान अपरिवर्तनीय वस्तुओं पर निर्भर करता है। यानी, आप उन्हें नहीं बदलते हैं। इसके बजाय, आप एक नई वस्तु बनाते हैं। यह वह है जो डिलीट, मैप, कम आदि करता है। सूची एक नई बनाई गई वस्तु होगी। उपरोक्त कोड स्निपेट में मैं एक नई बनाई गई वस्तु को सूचीबद्ध करने के लिए वापस आ रहा हूं। यह मेरे लिए काम करता है, क्योंकि मैं अपने कोड को इस तरह से डिजाइन करता हूं जो कार्यात्मक प्रोग्रामिंग का अनुसरण करता है।
डैनियल

44

स्विफ्ट 5: किसी ऐरे में तत्वों को निकालने के लिए ठंडा और आसान विस्तार है, बिना फ़िल्टर किए:

   extension Array where Element: Equatable {

    // Remove first collection element that is equal to the given `object`:
    mutating func remove(object: Element) {
        guard let index = firstIndex(of: object) else {return}
        remove(at: index)
    }

}

उपयोग:

var myArray = ["cat", "barbecue", "pancake", "frog"]
let objectToRemove = "cat"

myArray.remove(object: objectToRemove) // ["barbecue", "pancake", "frog"]

इसके अलावा इस तरह के रूप में अन्य प्रकार, के साथ काम करता Intहै क्योंकि Elementएक सामान्य प्रकार है:

var myArray = [4, 8, 17, 6, 2]
let objectToRemove = 17

myArray.remove(object: objectToRemove) // [4, 8, 6, 2]

1
दिलचस्प है यह एरे जहां तत्व: समतुल्य हिस्सा
निकोलस

1
प्रतिभाशाली। हालाँकि, यदि आप प्रोटोकॉल की एक सूची के साथ शुरू करते हैं तो यह काम नहीं करता है, जैसे - प्रोटोकॉल प्रकार 'इक्विटेबल' के अनुरूप नहीं हो सकता है क्योंकि केवल ठोस प्रकार ही प्रोटोकॉल के अनुरूप हो सकते हैं :-(
AW101

22

Swift4 के लिए:

list = list.filter{$0 != "your Value"}

15

Xcode 10+ के अनुसार, और WWDC 2018 सत्र 223 के अनुसार , "एल्गोरिदम को गले लगाते हुए," आगे जाने वाला एक अच्छा तरीका होगाmutating func removeAll(where predicate: (Element) throws -> Bool) rethrows

Apple का उदाहरण:

var phrase = "The rain in Spain stays mainly in the plain."
let vowels: Set<Character> = ["a", "e", "i", "o", "u"]

phrase.removeAll(where: { vowels.contains($0) })
// phrase == "Th rn n Spn stys mnly n th pln."

देख Apple के दस्तावेज़

इसलिए ओपी के उदाहरण में, जानवरों को हटाना [2], "चिंपियां":

var animals = ["cats", "dogs", "chimps", "moose"]
animals.removeAll(where: { $0 == "chimps" } )
// or animals.removeAll { $0 == "chimps" }

यह विधि पसंद की जा सकती है क्योंकि यह अच्छी तरह से (रैखिक बनाम द्विघात) है, पठनीय और साफ है। ध्यान रखें कि यह केवल Xcode 10+ में काम करता है, और जैसा कि यह बीटा में है।


removeAll (जहां :) केवल स्विफ्ट 4.2 में सक्षम होगा
व्लादि पुलिचव

14

कुछ ऑपरेशन स्विफ्ट में ऐरे से संबंधित हैं

सरणी बनाएँ

var stringArray = ["One", "Two", "Three", "Four"]

ऐरे में ऑब्जेक्ट जोड़ें

stringArray = stringArray + ["Five"]

सूचकांक वस्तु से मूल्य प्राप्त करें

let x = stringArray[1]

ऑब्जेक्ट जोड़ें

stringArray.append("At last position")

इंडेक्स पर ऑब्जेक्ट डालें

stringArray.insert("Going", atIndex: 1)

ऑब्जेक्ट निकालें

stringArray.removeAtIndex(3)

कॉनटैट वस्तु मूल्य

var string = "Concate Two object of Array \(stringArray[1]) + \(stringArray[2])"

14

आप ऐसा कर सकते हैं। पहले सुनिश्चित करें Dogकि सरणी में वास्तव में मौजूद है, फिर इसे हटा दें। forयदि आप विश्वास करते हैं तो कथन जोड़ेंDog आपके सरणी पर एक से अधिक बार होता है, ।

var animals = ["Dog", "Cat", "Mouse", "Dog"]
let animalToRemove = "Dog"

for object in animals
{
    if object == animalToRemove{
        animals.removeAtIndex(animals.indexOf(animalToRemove)!)
    }
}

अगर आपको यकीन है Dog है कि सरणी में बाहर निकलता है और केवल एक बार ऐसा हुआ है:

animals.removeAtIndex(animals.indexOf(animalToRemove)!)

यदि आपके पास तार और संख्या दोनों हैं

var array = [12, 23, "Dog", 78, 23]
let numberToRemove = 23
let animalToRemove = "Dog"

for object in array
{

    if object is Int
    {
        // this will deal with integer. You can change to Float, Bool, etc...
        if object == numberToRemove
        {
        array.removeAtIndex(array.indexOf(numberToRemove)!)
        }
    }
    if object is String
    {
        // this will deal with strings
        if object == animalToRemove
        {
        array.removeAtIndex(array.indexOf(animalToRemove)!)
        }
    }
}

अगर मेरी सरणी में स्ट्रिंग्स नहीं हैं तो क्या होगा?
अपेक

@apqu ने किया एक और अपडेट '|| वस्तु == इंट () 'और' || ऑब्जेक्ट == स्ट्रिंग () 'अनावश्यक हैं
GuiSoySauce

ऐरे को लूप करने से फिर से दक्षता आ जाती है। check .filter, .compactMap
MLBDG

11

यदि आप उस तत्व के सूचकांक को नहीं जानते हैं जिसे आप निकालना चाहते हैं, और तत्व समतुल्य प्रोटोकॉल के अनुरूप है, तो आप यह कर सकते हैं:

animals.removeAtIndex(animals.indexOf("dogs")!)

समतुल्य प्रोटोकॉल उत्तर देखें: मैं indexOfObject या एक उचित समसमूह कैसे करते हैं


10

अनुक्रमित सरणी का उपयोग करने वाले तत्वों को निकालें:

  1. स्ट्रिंग्स और इंडेक्स की सरणी

    let animals = ["cats", "dogs", "chimps", "moose", "squarrel", "cow"]
    let indexAnimals = [0, 3, 4]
    let arrayRemainingAnimals = animals
        .enumerated()
        .filter { !indexAnimals.contains($0.offset) }
        .map { $0.element }
    
    print(arrayRemainingAnimals)
    
    //result - ["dogs", "chimps", "cow"]
  2. इंटेगर और इंडेक्स का ऐरे

    var numbers = [0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12]
    let indexesToRemove = [3, 5, 8, 12]
    
    numbers = numbers
        .enumerated()
        .filter { !indexesToRemove.contains($0.offset) }
        .map { $0.element }
    
    print(numbers)
    
    //result - [0, 1, 2, 4, 6, 7, 9, 10, 11]



किसी अन्य सरणी के तत्व मान का उपयोग करके तत्व निकालें

  1. पूर्णांकों की सारणियाँ

    let arrayResult = numbers.filter { element in
        return !indexesToRemove.contains(element)
    }
    print(arrayResult)
    
    //result - [0, 1, 2, 4, 6, 7, 9, 10, 11]
  2. तारों का आघात

    let arrayLetters = ["a", "b", "c", "d", "e", "f", "g", "h", "i"]
    let arrayRemoveLetters = ["a", "e", "g", "h"]
    let arrayRemainingLetters = arrayLetters.filter {
        !arrayRemoveLetters.contains($0)
    }
    
    print(arrayRemainingLetters)
    
    //result - ["b", "c", "d", "f", "i"]

4
यह एक लाइनर उत्तर है और यह बेहतर कोडिंग और तेज़ निष्पादन के लिए बहुत कुशल है।
iOSDev

हाय @Krunal - महान जवाब, क्या आप निम्नलिखित प्रश्न पर नज़र डाल सकते हैं (छवि सरणी से चित्र जारी कर रहे हैं): stackoverflow.com/questions/47735975/…
सर्वर प्रोग्रामर

6

"अज्ञात सूचकांक के तत्व को हटाएं" के बारे में @ Suragch का विकल्प:

"इंडेक्सऑफ़ (तत्व)" का एक अधिक शक्तिशाली संस्करण है जो ऑब्जेक्ट के बजाय एक विधेय पर मेल खाएगा। यह उसी नाम से जाता है लेकिन इसे myObjects.indexOf {$ 0.property = valueToMatch} द्वारा बुलाया जाता है। यह myObjects एरे में पाए जाने वाले पहले मिलान वाले आइटम का इंडेक्स देता है।

यदि तत्व एक वस्तु / संरचना है, तो आप इसके किसी गुण के आधार पर उस तत्व को निकालना चाह सकते हैं। जैसे, आपके पास Car.color संपत्ति है, और आप अपनी कारों से "लाल" कार निकालना चाहते हैं।

if let validIndex = (carsArray.indexOf{$0.color == UIColor.redColor()}) {
  carsArray.removeAtIndex(validIndex)
}

कहीं भी, आप इसे दोहरा सकते हैं यदि उपरोक्त विवरण को फिर से एम्बेड करते हुए "सभी" लाल कारों को हटाने के लिए, यदि कोई दोहराव / लूप के भीतर कथन है, और लूप से "ब्रेक" करने के लिए ध्वज को सेट करने के लिए किसी अन्य ब्लॉक को संलग्न करना है।



4

यदि आपके पास कस्टम ऑब्जेक्ट्स की सरणी है, तो आप इस तरह विशिष्ट संपत्ति द्वारा खोज सकते हैं:

    if let index = doctorsInArea.indexOf({$0.id == doctor.id}){
        doctorsInArea.removeAtIndex(index)
    }

या यदि आप उदाहरण के लिए नाम से खोजना चाहते हैं

    if let index = doctorsInArea.indexOf({$0.name == doctor.name}){
        doctorsInArea.removeAtIndex(index)
    }

3

यह करना चाहिए (परीक्षण नहीं):

animals[2..3] = []

संपादित करें: और आपको इसे बनाने की आवश्यकता है var, नहीं let, अन्यथा यह एक अपरिवर्तनीय स्थिरांक है।


5
किसी अन्य सरणी को बनाने के लिए मौजूदा सरणी की एक (उप) रेंज का उपयोग करते समय सीमा को 3 डॉट्स की आवश्यकता होती है। उपरोक्त को जानवरों के रूप में लिखा जाना चाहिए [२ ... ३]
३६ पर जेविज

3

मैं निम्नलिखित विस्तार के साथ आया हूं जो तत्वों को हटाने से Arrayलेकर Arrayकार्यान्वयन में तत्वों को संभालने तक का ध्यान रखता है Equatable:

extension Array where Element: Equatable {

  mutating func removeEqualItems(item: Element) {
    self = self.filter { (currentItem: Element) -> Bool in
      return currentItem != item
    }
  }

  mutating func removeFirstEqualItem(item: Element) {
    guard var currentItem = self.first else { return }
    var index = 0
    while currentItem != item {
      index += 1
      currentItem = self[index]
    }
    self.removeAtIndex(index)
  }

}

उपयोग:

var test1 = [1, 2, 1, 2]
test1.removeEqualItems(2) // [1, 1]

var test2 = [1, 2, 1, 2]
test2.removeFirstEqualItem(2) // [1, 1, 2]

हाय @nburk - महान जवाब, क्या आप निम्नलिखित प्रश्न पर एक नज़र डाल सकते हैं (छवि सरणी से चित्र जारी कर रहे हैं): stackoverflow.com/questions/47735975/…
सर्वर प्रोग्रामर

1

स्ट्रिंग वस्तु को हटाने के लिए विस्तार

extension Array {
    mutating func delete(element: String) {
        self = self.filter() { $0 as! String != element }
    }
}

बल प्रयोग करना दुर्घटना का कारण बन सकता है, मुझे लगता है कि आपको इस मामले में बचना चाहिए।
उपयोगकर्ता 3206558

"म्यूटिंग" दुर्गंध क्या है?
विस्मयकारी E828232

यह बताता था कि यह फ़ंक्शन स्वयं (सरणी) को बदल देगा।
वरुण नहरिया

1

मैं इस एक्सटेंशन का उपयोग करता हूं, लगभग वरुण के समान, लेकिन यह एक (नीचे) सभी उद्देश्य है:

 extension Array where Element: Equatable  {
        mutating func delete(element: Iterator.Element) {
                self = self.filter{$0 != element }
        }
    }

1

किसी सरणी से तत्वों को निकालने के लिए remove(at:), removeLast()और का उपयोग करें removeAll()

yourArray = [1,2,3,4]

2 स्थिति पर मान निकालें

yourArray.remove(at: 2)

सरणी से अंतिम मान निकालें

yourArray.removeLast()

सेट से सभी सदस्यों को हटा देता है

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