Czy w Swift istnieje funkcja sprawdzająca, czy wszystkie elementy tablicy mają tę samą wartość? W moim przypadku jest to tablica typu Int
. Wiem, że mogę iterować nad nim za pomocą prostej pętli for I zastanawiałem się, czy jest coś, co jest wbudowane i szybsze.sprawdź, czy wszystkie elementy tablicy mają tę samą wartość w Swift
Odpowiedz
Każda metoda musi iterować wszystkie elementy aż inny element znaleziono:
func allEqualUsingLoop<T : Equatable>(array : [T]) -> Bool {
if let firstElem = array.first {
for elem in array {
if elem != firstElem {
return false
}
}
}
return true
}
Zamiast wyraźnego pętli można użyć funkcję:
func allEqualUsingContains<T : Equatable>(array : [T]) -> Bool {
if let firstElem = array.first {
return !contains(array, { $0 != firstElem })
}
return true
}
Jeśli elementy tablicy są Hashable
(takie jak Int
), możesz wtedy utworzyć Set
(dostępny od Swift 1.2) z elementów tablicy i sprawdzić, czy ma dokładnie jeden element.
func allEqualUsingSet<T : Hashable>(array : [T]) -> Bool {
let uniqueElements = Set(array)
return count(uniqueElements) <= 1
}
Szybki test analiza porównawcza wykazała, że „zawiera” metoda jest znacznie szybsza niż „Set” metody dla tablicy 1.000.000 liczb całkowitych, w szczególności jeśli elementy są nie wszystkie równe. Ma to sens, ponieważ powraca wkrótce , gdy zostanie znaleziony element niezgodny, podczas gdy Set(array)
zawsze przechodzi przez całą tablicę.
Również metody "zawiera" są równie szybkie lub nieco szybsze od jawnej pętli.
Oto prosty kod testu porównawczego. Oczywiście wyniki mogą się różnić z rozmiarem macierzy, liczbą różnych elementów i typem danych elementów.
func measureExecutionTime<T>(title: String, @noescape f : (() -> T)) -> T {
let start = NSDate()
let result = f()
let end = NSDate()
let duration = end.timeIntervalSinceDate(start)
println("\(title) \(duration)")
return result
}
var array = [Int](count: 1_000_000, repeatedValue: 1)
array[500_000] = 2
let b1 = measureExecutionTime("using loop ") {
return allEqualUsingLoop(array)
}
let b2 = measureExecutionTime("using contains") {
allEqualUsingContains(array)
}
let b3 = measureExecutionTime("using set ") {
allEqualUsingSet(array)
}
Wyniki (pro, konfiguracji Release MacBook):
using loop 0.000651001930236816 using contains 0.000567018985748291 using set 0.0344770550727844
Z array[1_000] = 2
wyniki są
using loop 9.00030136108398e-06 using contains 2.02655792236328e-06 using set 0.0306439995765686
Aktualizacja Swift 2/Xcode 7: Z powodu różnych zmian w składni Swift Funkcja jest teraz zapisana jako
func allEqual<T : Equatable>(array : [T]) -> Bool {
if let firstElem = array.first {
return !array.dropFirst().contains { $0 != firstElem }
}
return true
}
Ale teraz można również zdefiniować jako metodę rozszerzenia dla tablic:
extension Array where Element : Equatable {
func allEqual() -> Bool {
if let firstElem = first {
return !dropFirst().contains { $0 != firstElem }
}
return true
}
}
print([1, 1, 1].allEqual()) // true
print([1, 2, 1].allEqual()) // false
- 1. Sprawdź, czy wszystkie elementy mają tę samą klasę
- 2. Policz tę samą wartość w tablicy
- 3. Sprawdź, czy dwie macierze mają tę samą zawartość (w dowolnej kolejności).
- 4. W jQuery, w jaki sposób uzyskać wartość przycisku opcji, gdy wszystkie mają tę samą nazwę?
- 5. Dlaczego * curr i curr-> val mają tę samą wartość?
- 6. Dlaczego różne stałe animacji bloku mają tę samą wartość?
- 7. Porównaj dwie tablice obiektów i usuń elementy w drugiej, które mają tę samą wartość właściwości
- 8. Swift dodać wszystkie elementy z tablicy razem
- 9. Czy istnieje metoda sprawdzania, czy wszystkie elementy tablicy mają wartość "0"?
- 10. Sprawdź, czy wszystkie elementy spełniają warunek
- 11. Jak sprawdzić, czy dwa klucze w dyktafonie mają tę samą wartość?
- 12. Jak liczyć elementy w tablicy, które mają określoną wartość atrybutu?
- 13. System.Random nadal zwraca tę samą wartość
- 14. sprawdzanie, czy cztery zmienne binarne mają taką samą wartość, nieoczywistą?
- 15. Android - Sprawdź, czy wartość istnieje w tablicy
- 16. Sprawdź, czy wartość istnieje w tablicy
- 17. Jak mogę usunąć wszystkie elementy zerowe w tablicy Swift?
- 18. Pomnożyć wszystkie elementy w tablicy
- 19. Sprawdź elementy tablicy ciąg zawiera tylko elementy w innej tablicy
- 20. Jak ustawić wszystkie elementy tablicy na zero lub dowolną taką samą wartość?
- 21. Różni użytkownicy otrzymują tę samą wartość cookie w .ASPXANONYMOUS
- 22. Wstaw tę samą ustaloną wartość do wielu wierszy.
- 23. Dlaczego funkcja Object.hashCode() zwraca tę samą wartość w różnych przebiegach
- 24. Dlaczego otrzymuję tę samą wartość przesunięcia i pozycji w jQuery?
- 25. Czy mogę wielokrotnie dodać tę samą funkcję DataRow do DataTable?
- 26. Pokaż wszystkie pliki zawierają tę samą klasę częściową
- 27. Sprawdź, czy wartość znajduje się w tablicy (C#)
- 28. Czy przetworniki Clojure mają tę samą koncepcję, co pośrednie operacje na strumieniach w Javie?
- 29. Czy niezainicjalizowane elementy konstrukcyjne zawsze mają wartość zero?
- 30. Numpy: najszybszy sposób sprawdzenia, czy wszystkie elementy tablicy mają ten sam znak?
próbował to samo ... kompilator sprawdzane ;-) – Antonio
@Antonio: Ok dzięki! –
Jeśli jesteś zainteresowany innym, który możesz wypróbować, możesz użyć 'equal' i' Repeat': 'array.first.map {equal (array, Repeat (count: array.count, repeatValue: $ 0))} ?? true' (jest wolniej) –