删除特定的数组元素,等于字符串 - Swift

时间:2015-01-10 17:05:11

标签: ios iphone arrays swift elements

如果某个元素等于给定的字符串,是否没有简单的方法从数组中删除它?解决方法是找到要删除的数组元素的索引,然后查找removeAtIndex,或者创建一个新数组,其中附加所有不等于给定字符串的元素。但是没有更快的方法吗?

8 个答案:

答案 0 :(得分:121)

您可以使用filter()过滤数组,如下所示

var strings = ["Hello","Playground","World"]

strings = strings.filter{$0 != "Hello"}

print(strings)   // "[Playground, World]"

修改/更新

Xcode 10•Swift 4.2或更高版本

您可以使用名为RangeReplaceableCollection

的新removeAll(where:)变异方法
var strings = ["Hello","Playground","World"]

strings.removeAll { $0 == "Hello" }

print(strings)   // "[Playground, World]"

如果您只需删除元素的第一个匹配项,我们可以在RangeReplaceableCollection上实现自定义删除方法,将元素约束为Equatable:

extension RangeReplaceableCollection where Element: Equatable {
    @discardableResult
    mutating func removeFirstElementEqual(to element: Element) -> Element? {
        guard let index = firstIndex(of: element) else { return nil }
        return remove(at: index)
    }
}

或者对非Equatable元素使用谓词:

extension RangeReplaceableCollection {
    @discardableResult
    mutating func removeFirstElement(where predicate:  @escaping ((Element) -> Bool)) -> Element? {
        guard let index = firstIndex(where: predicate) else { return nil }
        return remove(at: index)
    }
}

var strings = ["Hello","Playground","World"]
strings.removeFirstElementEqual(to: "Hello")
print(strings)   // "[Playground, World]"
strings.removeFirstElement { $0 == "Playground" }
print(strings)   // "[World]"

答案 1 :(得分:9)

目前尚不清楚你的执行时间或代码数量是否更快。

在后一种情况下,您可以使用filter方法轻松创建副本。例如,给定以下数组:

let array = ["1", "2", "3", "4", "5"]

您可以创建一个包含所有元素的副本,但“2”为:

let filteredArray = array.filter { $0 != "2" }

答案 2 :(得分:8)

使用上面建议的过滤器很不错。但是,如果您只想删除一个值的某个值,或者您认为数组中没有重复项并且您想要更快的算法,请使用此(在Swift3中):

if let index = array.index(of: "stringToRemove") {
    array.remove(at: index)
} else {
    // not found
}

答案 3 :(得分:7)

您想要使用filter()。如果要删除单个元素(称为obj),则filter()谓词将为{ $0 != obj }。如果对大型阵列重复执行此操作,则可能是性能问题。如果您可以推迟删除单个对象并想要删除整个子数组,那么请使用以下内容:

var stringsToRemove : [String] = ...
var strings : [String] = ...

strings.filter { !contains(stringsToRemove, $0) }

例如:

 1> ["a", "b", "c", "d"].filter { !contains(["b", "c"], $0) }
$R5: [String] = 2 values {
  [0] = "a"
  [1] = "d"
}

答案 4 :(得分:4)

您可以将filter()与运算符重载结合使用,以生成易于重复的解决方案

func -= (inout left: [String], right: String){
    left = left.filter{$0 != right}    
}

var myArrayOfStrings:[String] = ["Hello","Playground","World"]

myArrayOfStrings -= "Hello"

print(myArrayOfStrings)   // "[Playground, World]"

答案 5 :(得分:2)

如果您需要从数组中删除subArray,那么使用 Swift3 这是一个完美的解决方案:

var array = ["a", "b", "c", "d", "e", "f", "g", "h", "i", "j"]            
let subArrayToDelete = ["c", "d", "e", "ee"]
array = array.filter{ !subArrayToDelete.contains($0) }
print(array) // ["a", "b", "f", "g", "h", "i", "j"]

这对您的表现更好,而不是一个一个地删除。

btw甚至更快解决方案是(但它将重新排列最终数组中的项目):

array = Array(Set(array).subtracting(subArrayToDelete))

答案 6 :(得分:0)

var ra = ["a", "ab", "abc", "a", "ab"]

print(ra)                               // [["a", "ab", "abc", "a", "ab"]

ra.removeAll(where: { $0 == "a" })

print(ra)                               // ["ab", "abc", "ab"]

答案 7 :(得分:0)

数组上的简单循环

var array = ["Apple","Banana","Orange"]

for (index,value) in array.enumerated(){
    if value == "Banana"{
    array.remove(at: index)
}