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


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


37
2018-01-10 17:05


起源


您是否查看了NSMutableArray类引用中的方法,如removeObject:或removeObjectIdenticalTo:? - rdelmar
我正在使用swift,我发现我可以用数组做的方法是在它的名字后加一个点,看看xcode建议的选项,包括removeAll,removeAtIndex,removeLast和removeRange。我看不到对removeObjectIdenticalTo的任何引用。 - TimWhiting
你的问题没有说明你是指Swift数组还是NSM​​utableArray;你可以在Swift中使用ether。如果您使用Swift进行编程,除非将数组转换为NSMutableArray,否则您将看不到NSMutableArray建议 - rdelmar
谢谢,我一个月前才开始编程,这非常有帮助 - TimWhiting


答案:


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

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

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

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

90
2018-01-10 17:14



它就像一个魅力! - xscoder
如此简单,适用于我的电子邮件应用程序! - Brian


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

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

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

您可以使用除“2”之外的所有元素创建副本:

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

9
2018-01-10 17:14



哈哈哈,我们完美同步,但我快了7秒。 :) - Leo Dabus
@LeonardoSavioDabus:哈哈,是的,但我的妻子在写答案的时候问我一个问题我打断了......所以我赢了;-) - Antonio
谢谢,我想这基本上就是我一直在做的事情,通过使用for循环遍历数组并将元素附加到另一个数组,如果它不等于我想删除的字符串,当我说得更快,你我说我的代码看起来比较整洁。谢谢! - TimWhiting


你会想要使用 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"
}

7
2018-01-10 17:30





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

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

6
2017-08-15 13:27





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

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

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

myArrayOfStrings -= "Hello"

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

3
2018-05-20 20:19





如果你需要从数组中删除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"]

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

顺便说一句 更快 解决方案是(但它将重新排列最终数组中的项目):

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

2
2017-12-14 21:56