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
Odpowiedz
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]"
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" }
Hahaha jesteśmy w doskonałej synchronizacji, ale byłem o 7 sekund szybszy. :) –
@LeonardoSavioDabus: Haha, tak, ale przerwała mi moja żona, zadając mi pytanie podczas pisania odpowiedzi ... więc wygrałem ;-) – Antonio
kkkkkk Wiem dokładnie, co masz na myśli :) –
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"
}
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]"
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))
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
}
remove to metoda mutowania, bez konieczności ponownego przypisywania jej do tablicy. 'array.remove (at: index)' –
Masz rację Leo, naprawiłem to. –
Pan spojrzał na metod w Odwołanie do klasy NSMutableArray, jak removeObject :, lub removeObjectIdenticalTo :? – rdelmar
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
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