Gibt es in Swift eine Funktion, die überprüft, ob alle Elemente eines Arrays den gleichen Wert haben? In meinem Fall ist es ein Array vom Typ Int
. Ich weiß, dass ich mit einer einfachen for-Schleife darüber iterieren kann. Ich habe mich nur gefragt, ob es etwas gibt, das eingebaut ist und schneller.Überprüfen Sie, ob alle Elemente eines Arrays in Swift den gleichen Wert haben.
Antwort
Jedes Verfahren iterieren müssen alle Elemente, bis ein anderes Element gefunden wird:
func allEqualUsingLoop<T : Equatable>(array : [T]) -> Bool {
if let firstElem = array.first {
for elem in array {
if elem != firstElem {
return false
}
}
}
return true
}
Statt einer expliziten Schleife Sie die Funktion verwenden können:
func allEqualUsingContains<T : Equatable>(array : [T]) -> Bool {
if let firstElem = array.first {
return !contains(array, { $0 != firstElem })
}
return true
}
Wenn die Array-Elemente Hashable
sind (wie Int
) dann können Sie ein Set
(verfügbar seit Swift 1.2) von den Array-Elementen erstellen und überprüfen, ob es genau ein Element hat.
func allEqualUsingSet<T : Hashable>(array : [T]) -> Bool {
let uniqueElements = Set(array)
return count(uniqueElements) <= 1
}
Ein schneller Benchmarking-Test ergab, dass die „enthält“ Verfahren viel schneller als die „set“ -Methode ist für eine Reihe von 1.000.000 ganzen Zahlen, insbesondere wenn die Elemente nicht alle gleich sind. Dies ergibt einen Sinn, da so bald zurückgibt, wie ein nicht übereinstimmendes Element gefunden wird, während Set(array)
immer das gesamte Array durchläuft.
Auch die "enthält" -Methoden ist genauso schnell oder etwas schneller als eine explizite Schleife.
Hier ist ein einfacher Benchmark-Code. Natürlich können die Ergebnisse mit der Array-Größe, der Anzahl der verschiedenen Elemente und dem Datentyp der Elemente variieren.
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)
}
Ergebnisse (auf einem MacBook Pro, Release-Konfiguration):
using loop 0.000651001930236816 using contains 0.000567018985748291 using set 0.0344770550727844
Mit array[1_000] = 2
die Ergebnisse sind
using loop 9.00030136108398e-06 using contains 2.02655792236328e-06 using set 0.0306439995765686
Update für Swift 2/Xcode 7: Aufgrund verschiedener Änderungen in der Swift Syntax Wird die Funktion nun als
func allEqual<T : Equatable>(array : [T]) -> Bool {
if let firstElem = array.first {
return !array.dropFirst().contains { $0 != firstElem }
}
return true
}
geschrieben Aber man kann jetzt auch als Erweiterung Methode für Arrays definieren:
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. Python - Überprüfen Sie, ob mehrere Variablen den gleichen Wert haben
- 2. Überprüfen, ob zwei Arrays die gleichen Werte an den gleichen Positionen haben
- 3. Überprüfen, ob zwei Listen die gleichen Elemente haben
- 4. Überprüfen Sie, ob String-Array-Elemente unterschiedliche Werte haben
- 5. AngularJS überprüfen, ob zwei Arrays verschiedene Elemente haben
- 6. Gibt es eine Möglichkeit zu überprüfen, ob zwei Arrays die gleichen Elemente haben?
- 7. Überprüfen Sie, ob ein Array alle Elemente eines anderen in Swift enthält
- 8. Überprüfen Sie, ob alle Kinder Elemente
- 9. Javascript überprüfen, ob alle Klicks Laden Elemente geladen haben
- 10. Testen Sie, ob Elemente eines Arrays in einer anderen
- 11. Sehen Sie, ob zwei Objekte den gleichen Typ haben
- 12. mqsql - überprüfen, ob ausgewählte Zeilen den gleichen Wert enthalten
- 13. Überprüfen Sie, ob ein Wert eines Array von Wörterbüchern eine Liste der Array-Elemente übereinstimmt
- 14. Überprüfen Sie, ob eine Liste alle Elemente aus einem anderen
- 15. Überprüfen, ob ein IEnumerable alle Elemente eines anderen IEnumerable enthält
- 16. Überprüfen Sie, ob alle Variablen gleich dem gleichen Wert in C++ sind
- 17. Was ist Scala, um herauszufinden, ob alle Elemente eines Arrays die gleiche Länge haben?
- 18. Überprüfen Sie, ob NSFont in Swift
- 19. Überprüfen Sie, ob alle Elemente, die eine Bedingung
- 20. Überprüfen, ob die Elemente eines Arrays die quadrierten Zahlen eines anderen sind
- 21. Überprüfen Sie, ob Array-Elemente gleich
- 22. Überprüfen Sie, ob sich Webformularwerte geändert haben
- 23. Überprüfen Sie, ob alle Array-Elemente leer sind
- 24. Elemente des gleichen Arrays vergleichen
- 25. Verwenden Sie jquery, um zu überprüfen, ob * alle * Felder einen Wert haben?
- 26. Überprüfen Sie, ob alle Elemente in einem anderen Array gefunden werden können
- 27. Wie kann ich überprüfen, ob zwei Arrays die gleichen Elemente in Perl enthalten?
- 28. überprüfen, ob Bedingung für den Wert 0
- 29. Vergleichen Sie Arrays in Swift
- 30. Überprüfen Sie, ob zwei Hashes den gleichen Satz von Schlüsseln haben
Versuchen die gleiche ... Compiler überprüft ;-) – Antonio
@Antonio: OK danke! –
Wenn Sie an einem anderen interessiert sind, können Sie 'equal' und' Repeat' verwenden: 'array.first.map {equal (array, Wiederholung (count: array.count, repeatedValue: $ 0))} ?? true' (es ist langsamer) –