prüfen Sie, ob alle Elemente eines Arrays den gleichen Wert haben in Swift
Gibt es eine Funktion in Swift, der prüft, ob alle Elemente eines Arrays den gleichen Wert haben? In meinem Fall, es ist ein array vom Typ Int
. Ich weiß, ich kann iteriert es mit einer einfachen for-Schleife, ich wollte Fragen, ob es etwas ist, was erbaut und schneller.
Du musst angemeldet sein, um einen Kommentar abzugeben.
Jede Methode muss iterativ über alle Elemente, bis ein anderes element ist gefunden:
Statt eines expliziten Schleife können Sie die
contains()
Funktion:Wenn die array-Elemente sind
Hashable
(wieInt
) dann können Sieerstellen Sie eine
Set
(verfügbar seit Swift 1.2) von der array-Elemente und überprüfen, ob es genau ein element.Einen schnellen Benchmark test ergab, dass die "enthält" - Methode ist viel schneller als die "set" - Methode
für ein array von 1.000.000 ganzen zahlen, insbesondere, wenn die Elemente
nicht alle gleich. Dies ist sinnvoll, weil
contains()
kehrt so baldals ein nicht übereinstimmendes element gefunden wird, in der Erwägung, dass
Set(array)
immerdurchläuft das gesamte array.
Auch die "enthält" - Methoden ist gleich schnell oder etwas schneller als eine explizite Schleife.
Hier ist einige einfache benchmarking-code. Natürlich können die Ergebnisse variieren
mit der array-Größe, die Anzahl der verschiedenen Elemente und die Elemente Datentyp.
Ergebnisse (auf einem MacBook Pro, Release-Konfiguration):
Mit
array[1_000] = 2
die Ergebnisse sindUpdate für Swift 2/Xcode 7: Aufgrund verschiedener änderungen in der Swift
syntax, die Funktion ist jetzt so geschrieben, wie
Aber jetzt können Sie auch definieren es als eine Erweiterung-Methode für arrays:
equal
undRepeat
:array.first.map { equal(array, Repeat(count: array.count, repeatedValue: $0)) } ?? true
(es ist langsamer)array[500_000] = 2
ich Messen 0.001789 sec und mitarray[1_000] = 2
3.99 e-06 Sek.extension Array
für die Kontrolle, wenn nurseveral elements of an array
den gleichen Wert haben?Soliution für Swift 4.2/Xcode 10:
Wenn Ihre aktuelle Xcode-version vor 10.0 finden Sie die Funktion
allSatisfy
vonArraySlice
im Xcode9to10Preparation. Sie können diese Bibliothek mit CocoaPods.dropLast()
.dropLast()
hier. In meinem Beispiel, wenn ich entfernendropLast()
den block übergebenallSatisfy
wird 4-mal genannt, aber jetzt ruft erst 3 mal, und das Ergebnis ist das gleiche.Swift-5 verwenden, können Sie eine der folgenden vier Möglichkeiten, um zu testet, ob alle Elemente eines Arrays gleich sind.
#1. Mit
Array
'sallSatisfy(_:)
MethodeallSatisfy(_:)
gibt einen booleschen Wert zurück, der angibt, ob jedes element einer Sequenz erfüllt ein bestimmtes Prädikat. Sie können das Prädikat, um zu testen, ob alle Elemente des Arrays gleich sind:#2. Mit
Array
'sreduce(_:_:)
MethodeAls alternative zu
allSatisfy(_:)
verwenden, können Siereduce(_:_:)
:#3. Mit
elementsEqual(_:)
MethodeelementsEqual(_:)
gibt einen booleschen Wert zurück, der angibt, ob zwei Sequenzen enthalten die gleichen Elemente in der gleichen Reihenfolge. Daher können Sie eine neue Sammlung erstellen, durch die Wiederholung das erste element des ersten array und vergleichen die erstere mit der letzteren:#4. Mit
Set
'sinit(_:)
initalizerWenn alle Elemente eines Arrays gleich sind, erstellen Sie einen Satz von diesem array soll in die festlegen, dass nur ein element: