Swift 3使用set和维护顺序

时间:2017-03-24 15:34:44

标签: arrays swift

Array1 = [1, 2, 3, 4, 5, 6]

Array2 = [1,5]

我想得到:

Array1 = [2, 3, 4, 6]

我想通过使用Set来实现这一点,因为这些数组可能会变大。 同样重要的是我要保持数组的顺序。

5 个答案:

答案 0 :(得分:10)

使用第二个数组中的所有元素创建, 然后过滤第一个数组,只获取的元素 在集合中:

let array1 = [5, 4, 1, 2, 3, 4, 1, 2]
let array2 = [1, 5]

let set2 = Set(array2)
let result = array1.filter { !set2.contains($0) }

print(result) // [4, 2, 3, 4, 2]

这保留了第一个的订单(和重复的元素) 阵列。如果第二个阵列可能很大,则使用集合是有利的, 因为查找速度更快。

答案 1 :(得分:3)

var array1 = [1, 2, 3, 4, 5, 6]

var array2 = [1,5]

var arrayResult = array1.enumerated()
    .filter { !array2.contains($0.0 + 1) }
    .map { $0.1 }

print(arrayResult)
  

[2,3,4,6]


另一种获得相同结果的方法:

<强> 1。用户过滤器

let arrayResult = array1.filter { element in
    return !array2.contains(element)
}

<强> 2。使用排序

array2.sorted(by: >).forEach { if $0 < self.array1.count { self.array1.remove(at: $0) } }  



使用索引数组删除元素:

  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]
    


  3. 使用其他数组的元素值删除元素

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

答案 2 :(得分:0)

使用过滤功能

let result = Array1.filter { element in
    return !Array2.contains(element)
}

答案 3 :(得分:0)

(注意:因为您添加了问题and maintaining order,我的答案不再正确,因为Set不保留订单。然后filter答案更合适

使用subtracting中的Set

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

您可以将其添加为运算符:

  

使用安东尼奥提到的阵列→设置→阵列方法,并且操作员的方便,正如弗雷塔格所指出的那样,我对此非常满意:

// Swift 3.x

func - <Element: Hashable>(lhs: [Element], rhs: [Element]) -> [Element]
{
    return Array(Set<Element>(lhs).subtracting(Set<Element>(rhs)))
}

引自:https://stackoverflow.com/a/42679608/1930509

答案 4 :(得分:0)

let array1 = [1, 2, 3, 4, 5, 6]
let array2 = [1,5]

let array3 = array1.reduce([]) { array2.contains($1) ? $0 : $0 + [$1] } 

print(array3)  // "[2, 3, 4, 6]\n"
相关问题