কীভাবে কোনও উপাদানকে সুইফটে অ্যারে থেকে সরানো যায়


236

অ্যাপলের নতুন ভাষা সুইফ্টের অ্যারে থেকে আমি কীভাবে একটি উপাদান আনসেট / আনসেট করতে পারি?

এখানে কিছু কোড রয়েছে:

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
এফওয়াইআই: removeসরানো উপাদানটি ফেরত দেয়:let animal = animals.remove(at: 2)
2

1
আমরা কি কেবল সূচকের উপর ভিত্তি করে ফিল্টার করতে পারি ??
শাকির

@ শাকিরসাইহাইড আপনি যে কোনও প্রাকটিকে আপনি ভাবতে পারেন তা ফিল্টার করতে পারবেন। উদাহরণস্বরূপ আপনি সমস্ত প্রাণীগুলিকে ফিল্টার করতে পারেন যা "" "এর মধ্যে শেষ হয়
Womble

জন্তু যোগ করুন = পোষা প্রাণী
পুজি ওয়াহানো

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 })
ক্রেগ গ্রুমিট 18

5
আপনি পরিচয় অপারেটরের সাথে চেক করতে চান না।
ড্যানিয়েল

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

2
নোট করুন যদি অন্য বস্তুগুলি listমুছে ফেলা হয় তবে এই মুছে ফেলা অন্য অ্যারে রেফারেন্সগুলি আপডেট করবে না যেহেতু আপনি নতুন অ্যারে নিযুক্ত করছেন list। আপনি যদি এই পদ্ধতির সাথে অ্যারেগুলি থেকে মুছে ফেলেন তবে কেবল একটি সূক্ষ্ম ধারণা।
ক্র্যাশলোট

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
উজ্জ্বল। প্রোটোকল টাইপ 'Equatable' সাথে সামঞ্জস্য করতে পারবেন না কারণ শুধুমাত্র কংক্রিট ধরনের প্রোটোকল থেকে :-( সামঞ্জস্য করতে পারেন - যদিও এটা কাজ যদি আপনি প্রোটোকল্স একটি তালিকা দিয়ে শুরু, যেমন না
AW101

22

সুইফট ৪-এর জন্য:

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

15

এক্সকোড 10+ হিসাবে এবং ডাব্লুডব্লিউডিসি 2018 সেশন 223 অনুসারে, "আলগোরিদিম আলিঙ্গন করা," এগিয়ে যাওয়ার একটি ভাল পদ্ধতি হবেmutating func removeAll(where predicate: (Element) throws -> Bool) rethrows

অ্যাপলের উদাহরণ:

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

এই পদ্ধতিটি পছন্দ করা যেতে পারে কারণ এটি ভাল স্কেল করে (লিনিয়ার বনাম চতুর্ভুজ), পাঠযোগ্য এবং পরিষ্কার। মনে রাখবেন যে এটি কেবল এক্সকোড 10+ তে কাজ করে এবং এটি লেখার মতোই বিটাতে রয়েছে।


সরানোর সমস্ত (যেখানে :) কেবল দ্রুত 4.2 এ সক্ষম হবে
ভ্লাদ পুলিচেভ

14

কয়েকটি অপারেশন সুইটের ইন অ্যারে সম্পর্কিত

অ্যারে তৈরি করুন

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

অ্যারেতে অবজেক্ট যুক্ত করুন

stringArray = stringArray + ["Five"]

সূচক অবজেক্ট থেকে মান পান

let x = stringArray[1]

অবজেক্ট অবজেক্ট

stringArray.append("At last position")

সূচীতে অবজেক্ট sertোকান

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

অবজেক্ট সরান

stringArray.removeAtIndex(3)

কনক্যাট অবজেক্টের মান

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

14

আপনি এটা করতে পারে। প্রথমে নিশ্চিত Dogহোন যে অ্যারেতে সত্যই উপস্থিত রয়েছে, তারপরে এটি সরিয়ে ফেলুন। যোগ forবিবৃতি আপনি যদি মনে করেন Dogmay আপনার শৃঙ্খলার একাধিকবার ঘটে।

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)!)
        }
    }
}

আমার অ্যারেতে স্ট্রিংস না থাকলে কী হবে?
এপ্যাক

@ এপকিউ আরও একটি আপডেট করেছে '|| অবজেক্ট == ইনট () 'এবং' || অবজেক্ট == স্ট্রিং () 'অপ্রয়োজনীয়
গুইসসস

একটি অ্যারে লুপিং আবার দক্ষতার দিকে যায়। ফিল্টার, .কম্প্যাক্টম্যাপ
এমএলবিডিজি

11

আপনি যে উপাদানটি সরাতে চান সেটির সূচি যদি আপনি না জানেন এবং উপাদানটি ইক্যুটেবল প্রোটোকল অনুসারে হয় তবে আপনি এটি করতে পারেন:

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

ইক্যুটেবল প্রোটোকল উত্তর দেখুন: আমি কীভাবে ইনডেক্সঅবঅবজেক্ট করব বা একটি সঠিক কন্টেন্টঅবজেক্ট করব


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
এটি একটি লাইনারের উত্তর এবং এটি আরও ভাল কোডিং এবং দ্রুত সম্পাদনের জন্য কার্যকর।
আইওএসডিভ

: - উচ্চ @Krunal মহান উত্তর, আপনি নিম্নলিখিত প্রশ্ন কটাক্ষপাত (একটি চিত্র অ্যারে থেকে ইমেজ মুক্তি) গ্রহণ করতে পারে stackoverflow.com/questions/47735975/...
সার্ভার প্রোগ্রামার

6

@ অজানা সূচকের উপাদান সরান "সুরগের বিকল্প সম্পর্কিত:

"IndexOf (এলিমেন্ট)" এর আরও শক্তিশালী সংস্করণ রয়েছে যা বস্তুর নিজের পরিবর্তে কোনও প্রিডিকেটে মিলবে। এটি একই নামে যায় তবে এটি myObjects.indexOf called $ 0.property = valueToMatch by দ্বারা ডাকে} এটি MyObjects অ্যারেতে পাওয়া প্রথম মিলের আইটেমের সূচকটি প্রদান করে।

যদি উপাদানটি কোনও অবজেক্ট / স্ট্রাক্ট হয় তবে আপনি যে কোনও একটি বৈশিষ্ট্যের মানের ভিত্তিতে সেই উপাদানটি সরাতে পারেন। উদাহরণস্বরূপ, আপনার একটি গাড়ী শ্রেণীর কার সিঙ্গল সম্পত্তি রয়েছে এবং আপনি আপনার গাড়িআরে থেকে "লাল" গাড়িটি সরাতে চান।

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

"মিউটেশন" ফানক কী?
আশ্চর্যজনক এলিফ্যান্ট 8232

এটি বলত যে এই ফাংশনটি স্ব (অ্যারে) পরিবর্তন করবে।
বরুণ নাহারিয়া

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()
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.