2015-01-10 19 views
33

Czy nie ma łatwego sposobu usunięcia określonego elementu z tablicy, jeśli jest on równy podanemu łańcuchowi znaków? Rozwiązaniem problemu jest znalezienie indeksu elementu tablicy, który chcesz usunąć, a następnie utworzenie nowej tablicy, w której dodaje się wszystkie elementy, które nie są równe podanemu łańcuchowi. Ale czy nie ma szybszej drogi?Usunięcie określonego elementu tablicy, równego ciągowi - Swift

+1

Pan spojrzał na metod w Odwołanie do klasy NSMutableArray, jak removeObject :, lub removeObjectIdenticalTo :? – rdelmar

+0

Używam szybkiego, a sposób, w jaki znajduję to, co mogę zrobić z tablicą, to wstawienie kropki po nazwie i zobaczenie, jakie opcje sugeruje xcode, to między innymi removeAll, removeAtIndex, removeLast i removeRange. Nie widzę żadnego odniesienia do removeObjectIdenticalTo. – TimWhiting

+1

W pytaniu nie określono, czy chodziło o Swift Array czy NSMutableArray; możesz użyć eteru w Swift.Jeśli programujesz w Swift, nie zobaczysz sugestii NSMutableArray, chyba że rzucisz tablicę na NSMutableArray – rdelmar

Odpowiedz

78

Można użyć filtra(), aby filtrować tablicę jak postępować

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

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

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

działa jak urok! – cubycode

+1

Tak prosty i działa doskonale dla mojej aplikacji e-mail! – Brian

7

Nie jest jasne, czy masz na myśli przez szybsze pod względem czasu lub ilości kodu wykonań.

W tym ostatnim przypadku można z łatwością utworzyć kopię, korzystając z metody filter. Na przykład, biorąc pod uwagę następującą tablicę:

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

można utworzyć kopię wszystkich elementów, ale „2” jako:

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

Hahaha jesteśmy w doskonałej synchronizacji, ale byłem o 7 sekund szybszy. :) –

+7

@LeonardoSavioDabus: Haha, tak, ale przerwała mi moja żona, zadając mi pytanie podczas pisania odpowiedzi ... więc wygrałem ;-) – Antonio

+0

kkkkkk Wiem dokładnie, co masz na myśli :) –

7

Będziemy chcieli wykorzystać filter(). Jeśli masz jeden element (o nazwie obj) do usunięcia, wówczas predykat filter() będzie { $0 != obj }. Jeśli robisz to wielokrotnie dla dużej tablicy, może to być problem z wydajnością. Jeśli można odroczyć usuwając poszczególne obiekty i usunąć cały sub-tablicę następnie użyć czegoś takiego:

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

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

na przykład:

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

Można użyć filtra() w połączeniu z przeciążeniem operatora do wytworzenia łatwo powtarzalne rozwiązanie:

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

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

myArrayOfStrings -= "Hello" 

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

jeśli trzeba usunąć subArray z tablicy to jest to Idealne rozwiązanie przy użyciu 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"] 

to jest lepsze dla wydajności niż usuwanie pojedynczo.

btw nawet szybciej rozwiązaniem jest (ale będzie to zmienić pozycji w końcowej tablicy):

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

Korzystanie filtr jak zasugerowano powyżej jest miły. Ale jeśli chcesz, aby usunąć tylko jedno wystąpienie wartości lub można zakładać nie ma duplikatów w tablicy i chcesz szybszego algorytmu, to wykorzystać (w Swift3):

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

remove to metoda mutowania, bez konieczności ponownego przypisywania jej do tablicy. 'array.remove (at: index)' –

+0

Masz rację Leo, naprawiłem to. –

Powiązane problemy