我有两个数组
var array1 = new Array ["a", "b", "c", "d", "e"]
var array2 = new Array ["a", "c", "d"]
我想从array1中删除array2的元素
Result ["b", "e"]
@Antonio的解决方案更高效,但如果保持顺序很重要,那么这个解决方案也可以使用:
var array1 = ["a", "b", "c", "d", "e"]
let array2 = ["a", "c", "d"]
array1 = array1.filter { !array2.contains($0) }
最简单的方法是将两个数组转换为集合,从第一个中减去第二个,将结果转换为数组并将其分配回array1
:
array1 = Array(Set(array1).subtracting(array2))
var array1 = ["a", "b", "c", "d", "e"]
var array2 = ["a", "c", "d"]
array1 = Array(Set(array1).subtract(Set(array2)))
(在从 array1 中减去 array2 之前先将 array2 转换为一个集合吗?) - Duncan Csubtract
方法(以及许多其他Set
方法)都需要一个SequenceType
参数,因此您可以传递一个数组。 - Antonio/* Swift 3.x */ func - <Element: Hashable>(lhs: [Element], rhs: [Element]) -> [Element] { return Array(Set<Element>(lhs).subtracting(Set<Element>(rhs))) }
- AmitaiB使用索引数组删除元素:
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"]
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]
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]
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"]
extension Array where Element: Equatable {
func subtracting(_ array: Array<Element>) -> Array<Element> {
self.filter { !array.contains($0) }
}
}
let setA = Set(arr1)
let setB = Set(arr2)
setA.subtract(setB)
虽然不在范围内,但如果这里有的话,会对我有所帮助。 在OBJECTIVE-C中从数组中移除子数组。
NSPredicate* predicate = [NSPredicate predicateWithFormat:@"not (self IN %@)", subArrayToBeDeleted];
NSArray* finalArray = [initialArray filteredArrayUsingPredicate:predicate];
希望它能够帮助到某些人:)
[[array1 mutableCopy] removeObjectsInArray:array2]
- jrc以下是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)
}
}
String
类型。extension Array where Element: Equatable {
func subtracting(_ array: Array<Element>) -> Array<Element> {
var result: Array<Element> = []
var toSub = array
for i in self {
if let index = toSub.firstIndex(of: i) {
toSub.remove(at: index)
continue
}
else {
result.append(i)
}
}
return result
}
}
let first = [1, 1, 2, 3, 3, 5, 6, 7, 7]
let second = [2, 2, 3, 4, 4, 5, 5, 6]
let result = first.subtracting(second)
//print result
//[1, 1, 3, 7, 7]
以下是通过定义自己的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"]
array2
先转换为Set
可能更高效;这仍然会保留array1
作为数组的顺序,但您可以在搜索集合上执行快速查找。 - Robertcontains
里添加where:
关键字,例如:array1 = array1.filter({ item in !array2.contains(where: { $0.id == item.id }) })
- Fede Cugliandolo