【问题标题】:Swift 3 Remove objects from an array that are present in another array using set and maintaining order [duplicate]Swift 3使用集合和维护顺序从另一个数组中删除存在于另一个数组中的对象[重复]
【发布时间】:2017-03-24 15:34:43
【问题描述】:
Array1 = [1, 2, 3, 4, 5, 6]

Array2 = [1,5]

我想得到:

Array1 = [2, 3, 4, 6]

我想通过使用Set 来做到这一点,因为这些数组可能会变得更大。 保持数组的顺序也很重要。

【问题讨论】:

  • 我无法准确理解如何对我的数组实现该答案,你能告诉我如何
  • 见下方答案
  • 注意:使用小写的变量名以避免与类名混淆

标签: arrays swift


【解决方案1】:

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

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]

这会保留从第一个开始的顺序(和重复元素) 大批。如果第二个数组很大,则使用集合是有利的, 因为查找速度更快。

【讨论】:

  • 杰出为我工作
【解决方案2】:
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]
    



使用另一个数组的元素值删除元素

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

【讨论】:

  • 这行得通,但老实说,我认为使用字典是一种更清洁的方法。你同意我的观点吗? @Krunal
  • 是的,同意你的看法
  • 请使用小写的变量名来区别类名
【解决方案3】:

使用过滤功能

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

【讨论】:

    【解决方案4】:

    (注意:因为您在问题中添加了and maintaining order,所以我的答案不再正确,因为Set 不保留顺序。那么filter 的答案更合适) em>

    Set 使用subtracting

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

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

    使用 Antonio 提到的 Array → Set → Array 方法,以及操作符的便利性,正如 freytag 所指出的,我对使用这个感到非常满意:

    // 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

    【讨论】:

    • 你能展示一下如何使用运算符和减法吗?我还是有点困惑
    • 集合是无序的集合。这不能保证保持原始项目的顺序。
    • 谢谢,是的,我知道 - 但他后来改变了原来的问题并添加了and maintaining order。我在答案中添加了注释。
    【解决方案5】:
    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"
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2019-11-23
      • 2015-06-19
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多