Wie kann ich überprüfen, ob sich das x
Array mit Go befindet, ohne das gesamte Array zu durchlaufen? Hat die Sprache ein Konstrukt?
Wie Python: if "x" in array: ...
Wie kann ich überprüfen, ob sich das x
Array mit Go befindet, ohne das gesamte Array zu durchlaufen? Hat die Sprache ein Konstrukt?
Wie Python: if "x" in array: ...
strings.Index
) machen, wird klarer, was der Code tut. Ich habe den Eindruck, dass Sie vielleicht denken, Pythonsin array:
macht etwas schnelles / magisches. AFAIK ist es nicht. Wenn Sie die Schleife explizit machen, wird der Verfasser (und alle Leser) darauf aufmerksam gemacht und andere Implementierungen (z. B. eine Karte) berücksichtigt.Antworten:
In Go gibt es keinen integrierten Operator. Sie müssen über das Array iterieren. Sie können dazu Ihre eigene Funktion schreiben:
Wenn Sie nach einer Mitgliedschaft suchen möchten, ohne die gesamte Liste zu durchlaufen, müssen Sie eine Karte anstelle eines Arrays oder Slice wie folgt verwenden:
quelle
Eine andere Lösung, wenn die Liste statische Werte enthält.
Beispiel: Überprüfen eines gültigen Werts aus einer Liste gültiger Werte:
quelle
Dies ist ein Zitat aus dem Buch "Programming in Go: Erstellen von Anwendungen für das 21. Jahrhundert":
https://play.golang.org/p/UIndYQ8FeW
quelle
n*log(n) + log(n)
, wie es zweiDas obige Beispiel mit sort ist naheliegend, aber bei Zeichenfolgen verwenden Sie einfach SearchString:
https://golang.org/pkg/sort/#SearchStrings
quelle
sort.SearchStrings
.Hatte gerade eine ähnliche Frage und beschloss, einige der Vorschläge in diesem Thread auszuprobieren.
Ich habe die besten und schlechtesten Szenarien für drei Arten der Suche verglichen:
Hier ist der Funktionscode:
In Best-Case-Szenarien wird das erste Element in Listen ausgewählt, in Worst-Case-Szenarien wird ein nicht vorhandener Wert verwendet.
Hier sind die Ergebnisse:
BenchmarkBelongsToMapWorstCase-4 2000000 787 ns/op BenchmarkBelongsToSwitchWorstCase-4 2000000000 0.35 ns/op BenchmarkBelongsToListWorstCase-4 100000000 14.7 ns/op BenchmarkBelongsToMapBestCase-4 2000000 683 ns/op BenchmarkBelongsToSwitchBestCase-4 100000000 10.6 ns/op BenchmarkBelongsToListBestCase-4 100000000 10.4 ns/op
Switch gewinnt den ganzen Weg, der schlimmste Fall ist überaus schneller als der beste Fall. Karten sind die schlechtesten und die Liste ist näher am Umschalten.
Die Moral lautet also: Wenn Sie eine statische, relativ kleine Liste haben, ist die switch-Anweisung der richtige Weg.
quelle
:
statt,
in der switch-Anweisung? Macht es schneller?case
Anweisungen anstelle eines Einzelfalls zu verwenden. Die Ergebnisse sind bei beiden Funktionen vernünftigerweise gleich.Eine andere Option ist die Verwendung einer Karte als Set. Sie verwenden nur die Schlüssel und der Wert ist so etwas wie ein Boolescher Wert, der immer wahr ist. Dann können Sie leicht überprüfen, ob die Karte den Schlüssel enthält oder nicht. Dies ist nützlich, wenn Sie das Verhalten eines Satzes benötigen. Wenn Sie einen Wert mehrmals hinzufügen, ist er nur einmal im Satz enthalten.
Hier ist ein einfaches Beispiel, in dem ich Zufallszahlen als Schlüssel zu einer Karte hinzufüge. Wenn dieselbe Nummer mehrmals generiert wird, spielt dies keine Rolle, sie wird nur einmal in der endgültigen Karte angezeigt. Dann benutze ich eine einfache if-Prüfung, um festzustellen, ob sich ein Schlüssel in der Karte befindet oder nicht.
Hier ist es unterwegs Spielplatz
quelle
Dies ist so nah wie möglich am natürlichen Gefühl von Pythons "in" -Operator. Sie müssen Ihren eigenen Typ definieren. Dann können Sie die Funktionalität dieses Typs erweitern, indem Sie eine Methode wie "has" hinzufügen, die sich so verhält, wie Sie es sich erhoffen.
Ich habe eine Dienstprogrammbibliothek, in der ich einige allgemeine Dinge wie diese für verschiedene Arten von Slices definiere, z. B. solche, die Ganzzahlen oder meine eigenen anderen Strukturen enthalten.
Ja, es läuft in linearer Zeit, aber das ist nicht der Punkt. Es geht darum zu fragen und zu lernen, welche gängigen Sprachkonstrukte Go hat und welche nicht. Es ist eine gute Übung. Ob diese Antwort albern oder nützlich ist, liegt beim Leser.
quelle