Removing objects from an array based on another array

前端 未结 9 1454
南方客
南方客 2021-02-05 01:14

I have two arrays like this:

var arrayA = [\"Mike\", \"James\", \"Stacey\", \"Steve\"]
var arrayB = [\"Steve\", \"Gemma\", \"James\", \"Lucy\"]

相关标签:
9条回答
  • 2021-02-05 01:36

    The easiest way is by using the new Set container (added in Swift 1.2 / Xcode 6.3):

    var setA = Set(arrayA)
    var setB = Set(arrayB)
    
    // Return a set with all values contained in both A and B
    let intersection = setA.intersect(setB) 
    
    // Return a set with all values in A which are not contained in B
    let diff = setA.subtract(setB)
    

    If you want to reassign the resulting set to arrayA, simply create a new instance using the copy constructor and assign it to arrayA:

    arrayA = Array(intersection)
    

    The downside is that you have to create 2 new data sets. Note that intersect doesn't mutate the instance it is invoked in, it just returns a new set.

    There are similar methods to add, subtract, etc., you can take a look at them

    0 讨论(0)
  • 2021-02-05 01:37

    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"]
      
    0 讨论(0)
  • 2021-02-05 01:40

    Like this:

    var arrayA = ["Mike", "James", "Stacey", "Steve"]
    var arrayB = ["Steve", "Gemma", "James", "Lucy"]
    for word in arrayB {
        if let ix = find(arrayA, word) {
            arrayA.removeAtIndex(ix)
        }
    }
    // now arrayA is ["Mike", "Stacey"]
    
    0 讨论(0)
提交回复
热议问题