iOS swift remove elements of an array from another array

IosArraysSwift

Ios Problem Overview


I have two arrays

var array1 = new Array ["a", "b", "c", "d", "e"]
var array2 = new Array ["a", "c", "d"]

I want to remove elements of array2 from array1

Result ["b", "e"]

Ios Solutions


Solution 1 - Ios

@Antonio's solution is more performant, but this preserves ordering, if that's important:

var array1 = ["a", "b", "c", "d", "e"]
let array2 = ["a", "c", "d"]
array1 = array1.filter { !array2.contains($0) }

Solution 2 - Ios

The easiest way is to convert both arrays to sets, subtract the second from the first, convert to the result to an array and assign it back to array1:

array1 = Array(Set(array1).subtracting(array2))

Note that your code is not valid Swift - you can use type inference to declare and initialize both arrays as follows:

var array1 = ["a", "b", "c", "d", "e"]
var array2 = ["a", "c", "d"]

Solution 3 - Ios

Remove elements using indexes array:

  1. Array of Strings and indexes

     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. Array of Integers and indexes

     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]
    



Remove elements using element value of another array

  1. Arrays of integers

     let arrayResult = numbers.filter { element in
         return !indexesToRemove.contains(element)
     }
     print(arrayResult)
    
     //result - [0, 1, 2, 4, 6, 7, 9, 10, 11]
    
  2. Arrays of strings

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

Solution 4 - Ios

Here is an extension with @jrc answer:

extension Array where Element: Equatable {
    func subtracting(_ array: Array<Element>) -> Array<Element> {
        self.filter { !array.contains($0) }
    }
}

Solution 5 - Ios

You can create sets and then use the subtract method

let setA = Set(arr1)
let setB = Set(arr2)
setA.subtract(setB)

Solution 6 - Ios

out of scope but it would help me if it had been here. removing subArray from array in OBJECTIVE-C

NSPredicate* predicate = [NSPredicate predicateWithFormat:@"not (self IN %@)", subArrayToBeDeleted];
NSArray* finalArray = [initialArray filteredArrayUsingPredicate:predicate];

hope it will ever help someone :)

Solution 7 - Ios

An extended version of the answer by Shai Balassiano:

extension Array where Element: Equatable {
  func subtracting(_ array: [Element]) -> [Element] {
      self.filter { !array.contains($0) }
  }

  mutating func remove(_ array: [Element]) {
      self = self.subtracting(array)
  }
}

Solution 8 - Ios

Here is one more solution by defining your own PredicateSet.

struct PredicateSet<A> {
  let contains: (A) -> Bool
}

let animals = ["Cow", "Bulldog", "Labrador"]
let dogs = ["Bulldog", "Labrador"]

let notDogs = PredicateSet { !dogs.contains($0) }

print(animals.filter(notDogs.contains)) // ["Cow"]

Attributions

All content for this solution is sourced from the original question on Stackoverflow.

The content on this page is licensed under the Attribution-ShareAlike 4.0 International (CC BY-SA 4.0) license.

Content TypeOriginal AuthorOriginal Content on Stackoverflow
QuestionDev ImakView Question on Stackoverflow
Solution 1 - IosjrcView Answer on Stackoverflow
Solution 2 - IosAntonioView Answer on Stackoverflow
Solution 3 - IosKrunalView Answer on Stackoverflow
Solution 4 - IosShai BalassianoView Answer on Stackoverflow
Solution 5 - IosAdnan AftabView Answer on Stackoverflow
Solution 6 - IosTung FamView Answer on Stackoverflow
Solution 7 - IosStanislav M.View Answer on Stackoverflow
Solution 8 - IosSantManView Answer on Stackoverflow