मैं Apple की नई भाषा स्विफ्ट में किसी ऐरे से किसी तत्व को कैसे हटा / हटा सकता हूँ?
यहाँ कुछ कोड है:
let animals = ["cats", "dogs", "chimps", "moose"]
तत्व animals[2]
को सरणी से कैसे हटाया जा सकता है?
मैं Apple की नई भाषा स्विफ्ट में किसी ऐरे से किसी तत्व को कैसे हटा / हटा सकता हूँ?
यहाँ कुछ कोड है:
let animals = ["cats", "dogs", "chimps", "moose"]
तत्व animals[2]
को सरणी से कैसे हटाया जा सकता है?
जवाबों:
let
कीवर्ड स्थिरांक बदला नहीं जा सकता है कि घोषित करने के लिए है। यदि आप एक चर को संशोधित करना चाहते हैं, जिसका आपको उपयोग करना चाहिए var
, जैसे:
var animals = ["cats", "dogs", "chimps", "moose"]
animals.remove(at: 2) //["cats", "dogs", "moose"]
एक गैर-म्यूटिंग विकल्प जो मूल संग्रह को अपरिवर्तित रखेगा, filter
आपके द्वारा हटाए गए तत्वों के बिना एक नया संग्रह बनाने के लिए उपयोग करना है, जैसे:
let pets = animals.filter { $0 != "chimps" }
दिया हुआ
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 को अपडेट किया गया
उपरोक्त उत्तर लगता है कि आप उस तत्व के सूचकांक को जानते हैं जिसे आप हटाना चाहते हैं।
अक्सर आप उस ऑब्जेक्ट के संदर्भ को जानते हैं जिसे आप सरणी में हटाना चाहते हैं। (आपने अपने सरणी के माध्यम से पुनरावृत्ति की है और इसे पाया है, उदाहरण के लिए) ऐसे मामलों में वस्तु संदर्भ के साथ सीधे काम करना आसान हो सकता है, वह भी इसके सूचकांक में हर जगह से गुजरने के बिना। इसलिए, मैं इस समाधान का सुझाव देता हूं। यह पहचान ऑपरेटर का उपयोग करता है !==
, जिसका उपयोग आप यह परखने के लिए करते हैं कि क्या दो ऑब्जेक्ट संदर्भ दोनों एक ही ऑब्जेक्ट उदाहरण को संदर्भित करते हैं।
func delete(element: String) {
list = list.filter() { $0 !== element }
}
बेशक यह सिर्फ String
एस के लिए काम नहीं करता है ।
list = list.filter({ $0 != element })
array.indexOf({ $0 == obj })
list
इस विलोपन को संदर्भित करते हैं तो आप अन्य ऐरे संदर्भों को अपडेट नहीं करेंगे क्योंकि आप एक नया एरे को असाइन कर रहे हैं list
। यदि आप इस दृष्टिकोण के साथ सरणियों से हटाते हैं तो बस एक सूक्ष्म निहितार्थ है।
स्विफ्ट 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]
Swift4 के लिए:
list = list.filter{$0 != "your Value"}
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."
इसलिए ओपी के उदाहरण में, जानवरों को हटाना [2], "चिंपियां":
var animals = ["cats", "dogs", "chimps", "moose"]
animals.removeAll(where: { $0 == "chimps" } )
// or animals.removeAll { $0 == "chimps" }
यह विधि पसंद की जा सकती है क्योंकि यह अच्छी तरह से (रैखिक बनाम द्विघात) है, पठनीय और साफ है। ध्यान रखें कि यह केवल Xcode 10+ में काम करता है, और जैसा कि यह बीटा में है।
कुछ ऑपरेशन स्विफ्ट में ऐरे से संबंधित हैं
सरणी बनाएँ
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])"
आप ऐसा कर सकते हैं। पहले सुनिश्चित करें 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)!)
}
}
}
यदि आप उस तत्व के सूचकांक को नहीं जानते हैं जिसे आप निकालना चाहते हैं, और तत्व समतुल्य प्रोटोकॉल के अनुरूप है, तो आप यह कर सकते हैं:
animals.removeAtIndex(animals.indexOf("dogs")!)
समतुल्य प्रोटोकॉल उत्तर देखें: मैं indexOfObject या एक उचित समसमूह कैसे करते हैं
अनुक्रमित सरणी का उपयोग करने वाले तत्वों को निकालें:
स्ट्रिंग्स और इंडेक्स की सरणी
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"]
इंटेगर और इंडेक्स का ऐरे
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]
किसी अन्य सरणी के तत्व मान का उपयोग करके तत्व निकालें
पूर्णांकों की सारणियाँ
let arrayResult = numbers.filter { element in
return !indexesToRemove.contains(element)
}
print(arrayResult)
//result - [0, 1, 2, 4, 6, 7, 9, 10, 11]
तारों का आघात
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"]
"अज्ञात सूचकांक के तत्व को हटाएं" के बारे में @ Suragch का विकल्प:
"इंडेक्सऑफ़ (तत्व)" का एक अधिक शक्तिशाली संस्करण है जो ऑब्जेक्ट के बजाय एक विधेय पर मेल खाएगा। यह उसी नाम से जाता है लेकिन इसे myObjects.indexOf {$ 0.property = valueToMatch} द्वारा बुलाया जाता है। यह myObjects एरे में पाए जाने वाले पहले मिलान वाले आइटम का इंडेक्स देता है।
यदि तत्व एक वस्तु / संरचना है, तो आप इसके किसी गुण के आधार पर उस तत्व को निकालना चाह सकते हैं। जैसे, आपके पास Car.color संपत्ति है, और आप अपनी कारों से "लाल" कार निकालना चाहते हैं।
if let validIndex = (carsArray.indexOf{$0.color == UIColor.redColor()}) {
carsArray.removeAtIndex(validIndex)
}
कहीं भी, आप इसे दोहरा सकते हैं यदि उपरोक्त विवरण को फिर से एम्बेड करते हुए "सभी" लाल कारों को हटाने के लिए, यदि कोई दोहराव / लूप के भीतर कथन है, और लूप से "ब्रेक" करने के लिए ध्वज को सेट करने के लिए किसी अन्य ब्लॉक को संलग्न करना है।
यदि आपके पास कस्टम ऑब्जेक्ट्स की सरणी है, तो आप इस तरह विशिष्ट संपत्ति द्वारा खोज सकते हैं:
if let index = doctorsInArea.indexOf({$0.id == doctor.id}){
doctorsInArea.removeAtIndex(index)
}
या यदि आप उदाहरण के लिए नाम से खोजना चाहते हैं
if let index = doctorsInArea.indexOf({$0.name == doctor.name}){
doctorsInArea.removeAtIndex(index)
}
यह करना चाहिए (परीक्षण नहीं):
animals[2..3] = []
संपादित करें: और आपको इसे बनाने की आवश्यकता है var
, नहीं let
, अन्यथा यह एक अपरिवर्तनीय स्थिरांक है।
मैं निम्नलिखित विस्तार के साथ आया हूं जो तत्वों को हटाने से 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]
स्ट्रिंग वस्तु को हटाने के लिए विस्तार
extension Array {
mutating func delete(element: String) {
self = self.filter() { $0 as! String != element }
}
}
मैं इस एक्सटेंशन का उपयोग करता हूं, लगभग वरुण के समान, लेकिन यह एक (नीचे) सभी उद्देश्य है:
extension Array where Element: Equatable {
mutating func delete(element: Iterator.Element) {
self = self.filter{$0 != element }
}
}
remove
हटाए गए तत्व को लौटाता है:let animal = animals.remove(at: 2)