iOS swift从另一个数组中删除一个数组的元素
Posted
技术标签:
【中文标题】iOS swift从另一个数组中删除一个数组的元素【英文标题】:iOS swift remove elements of an array from another array 【发布时间】:2015-08-13 09:29:43 【问题描述】:我有两个数组
var array1 = new Array ["a", "b", "c", "d", "e"]
var array2 = new Array ["a", "c", "d"]
我想从 array1 中删除 array2 的元素
Result ["b", "e"]
【问题讨论】:
【参考方案1】:@Antonio's solution 性能更高,但如果这很重要,这会保留排序:
var array1 = ["a", "b", "c", "d", "e"]
let array2 = ["a", "c", "d"]
array1 = array1.filter !array2.contains($0)
【讨论】:
喜欢这种方法 好答案!但是你知道如何在 obj-c 上写这个吗?请帮帮我:)谢谢 如果元素是Hashable
,就像在这种情况下一样,首先将array2
转换为Set
可能会更高效;这仍然会保留顺序,因为 array1
仍然是一个数组,但您可以对搜索集合执行快速查找。
要使其工作,您的对象还必须符合 Equatable 协议。如果不是,你会在 Swift 4.0 中得到这个奇怪的错误:Missing argument label 'where:' in call in the contains function in the filter.
@c1pherB1t 是的,您可以在contains
中添加where:
,即array1 = array1.filter( item in !array2.contains(where: $0.id == item.id ) )
【参考方案2】:
最简单的方法是将两个数组转换为集合,从第一个中减去第二个,将结果转换为数组并将其分配回array1
:
array1 = Array(Set(array1).subtracting(array2))
请注意,您的代码不是有效的 Swift - 您可以使用类型推断来声明和初始化两个数组,如下所示:
var array1 = ["a", "b", "c", "d", "e"]
var array2 = ["a", "c", "d"]
【讨论】:
你能从一个集合中减去一个数组吗?那不需要array1 = Array(Set(array1).subtract(Set(array2)))
(在从array1中减去它之前将Array2转换为一个集合?)
@DuncanC:subtract
方法(以及许多其他 Set
方法)采用 SequenceType
参数,所以是的,您可以传递一个数组。
我使用:/* Swift 3.x */ func - <Element: Hashable>(lhs: [Element], rhs: [Element]) -> [Element] return Array(Set<Element>(lhs).subtracting(Set<Element>(rhs)))
这真的很好 - 它似乎也尊重原始顺序 - 总是有保证吗?
不保证顺序: > 唯一元素的无序集合。 developer.apple.com/documentation/swift/set【参考方案3】:
使用索引数组删除元素:
字符串和索引数组
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"]
整数和索引数组
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]
使用另一个数组的元素值删除元素
整数数组
let arrayResult = numbers.filter element in
return !indexesToRemove.contains(element)
print(arrayResult)
//result - [0, 1, 2, 4, 6, 7, 9, 10, 11]
字符串数组
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】:这是一个带有@jrc 答案的扩展:
extension Array where Element: Equatable
func subtracting(_ array: Array<Element>) -> Array<Element>
self.filter !array.contains($0)
【讨论】:
不错的方法,但如果你有一百万个条目,这是 n^2【参考方案5】:超出范围,但如果它在这里,它将对我有所帮助。 从 OBJECTIVE-C
中的数组中删除子数组NSPredicate* predicate = [NSPredicate predicateWithFormat:@"not (self IN %@)", subArrayToBeDeleted];
NSArray* finalArray = [initialArray filteredArrayUsingPredicate:predicate];
希望它会帮助某人:)
【讨论】:
这不是很有效。只需这样做:[[array1 mutableCopy] removeObjectsInArray:array2]
【参考方案6】:
您可以创建集合,然后使用减法
let setA = Set(arr1)
let setB = Set(arr2)
setA.subtract(setB)
【讨论】:
intersect 显示共同的元素,我想删除共同的元素并在另一个数组中获取其他元素 我更新了代码,你需要使用减法【参考方案7】: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)
【讨论】:
【参考方案8】:这是通过定义您自己的 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"]
【讨论】:
以上是关于iOS swift从另一个数组中删除一个数组的元素的主要内容,如果未能解决你的问题,请参考以下文章