2015-01-10 36 views
33

Không có cách nào dễ dàng để loại bỏ một phần tử cụ thể khỏi một mảng, nếu nó bằng một chuỗi đã cho? Cách giải quyết là tìm chỉ mục của phần tử của mảng mà bạn muốn loại bỏ, sau đó removeAtIndex hoặc tạo một mảng mới nơi bạn chắp thêm tất cả các phần tử không bằng chuỗi đã cho. Nhưng không có cách nào nhanh hơn?Xóa phần tử mảng cụ thể, bằng với chuỗi - Swift

+1

Bạn đã xem các phương pháp trong Tham chiếu lớp NSMutableArray, như removeObject :, hoặc removeObjectIdenticalTo :? – rdelmar

+0

Tôi đang sử dụng nhanh chóng, và cách tôi tìm hiểu những gì tôi có thể làm với một mảng, là đặt một dấu chấm sau tên của nó và xem các tùy chọn xcode gợi ý, chúng bao gồm removeAll, removeAtIndex, removeLast và removeRange. Tôi không thể thấy bất kỳ tham chiếu nào tới removeObjectIdenticalTo. – TimWhiting

+1

Câu hỏi của bạn không chỉ rõ bạn đang đề cập đến một Swift Array hay một NSMutableArray; bạn có thể sử dụng ether trong Swift.Nếu bạn đang lập trình trong Swift, bạn sẽ không thấy các đề xuất NSMutableArray trừ khi bạn đưa mảng của mình vào NSMutableArray – rdelmar

Trả lời

78

Bạn có thể sử dụng bộ lọc() để lọc mảng của bạn như sau

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

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

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

nó hoạt động như một sự quyến rũ! – cubycode

+1

Rất đơn giản và hoạt động tuyệt vời cho ứng dụng email của tôi! – Brian

7

Nó không rõ ràng nếu bằng nhanh hơn bạn có ý nghĩa về mặt thời gian thực hiện hoặc số lượng mã.

Trong trường hợp thứ hai, bạn có thể dễ dàng tạo bản sao bằng phương thức filter. Ví dụ, với các mảng sau:

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

bạn có thể tạo một bản sao với tất cả các yếu tố nhưng "2" như:

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

Hahaha chúng tôi hoàn toàn đồng bộ nhưng tôi đã nhanh hơn 7 giây. :) –

+7

@LeonardoSavioDabus: Haha, vâng, nhưng tôi đã bị gián đoạn bởi vợ tôi hỏi tôi khi viết câu trả lời ... vì vậy tôi đã thắng ;-) – Antonio

+0

kkkkkk Tôi biết chính xác ý bạn là :) –

7

Bạn sẽ muốn sử dụng filter(). Nếu bạn có một phần tử đơn lẻ (gọi là obj) để xóa, thì vị từ filter() sẽ là { $0 != obj }. Nếu bạn làm điều này nhiều lần cho một mảng lớn thì đây có thể là vấn đề về hiệu suất. Nếu bạn có thể trì hoãn việc loại bỏ đối tượng cá nhân và muốn xóa toàn bộ tiểu mảng sau đó sử dụng một cái gì đó như:

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

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

ví dụ:

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

Bạn có thể sử dụng bộ lọc() kết hợp với nhà điều hành quá tải để tạo ra một giải pháp dễ dàng lặp lại:

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

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

myArrayOfStrings -= "Hello" 

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

nếu bạn cần phải xoá subarray từ mảng thì đây là một giải pháp hoàn hảo sử dụng 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"] 

này là tốt hơn cho hiệu suất của bạn chứ không phải xóa từng cái một.

btw thậm chí nhanh giải pháp là (nhưng nó sẽ sắp xếp lại các mục trong mảng thức):

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

Sử dụng bộ lọc như gợi ý ở trên là tốt đẹp. Nhưng nếu bạn muốn xóa chỉ một lần xuất hiện của một giá trị hoặc bạn cho rằng không có bản sao nào trong mảng và bạn muốn có thuật toán nhanh hơn, hãy sử dụng thuật toán này (trong Swift3):

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

loại bỏ là một phương pháp đột biến không cần phải gán lại nó cho mảng. 'array.remove (at: index)' –

+0

Bạn nói đúng, tôi đã sửa nó. –

Các vấn đề liên quan