Beim Durchlaufen der zurückgegebenen Karte im Code, der von der Themenfunktion zurückgegeben wird, werden die Tasten nicht in der richtigen Reihenfolge angezeigt.
Wie kann ich die Schlüssel in Ordnung bringen / die Karte so sortieren, dass die Schlüssel in Ordnung sind und die Werte übereinstimmen?
Hier ist der Code .
Antworten:
Der Go-Blog: Go-Karten in Aktion bietet eine hervorragende Erklärung.
Hier ist meine modifizierte Version des Beispielcodes: http://play.golang.org/p/dvqcGPYy3-
Ausgabe:
quelle
keys := make([]int, len(m))
und dann durch Indexkeys[i] = k
anstelle vonappend
Gemäß der Go-Spezifikation ist die Reihenfolge der Iteration über eine Karte undefiniert und kann zwischen den Programmläufen variieren. In der Praxis ist es nicht nur undefiniert, sondern auch absichtlich randomisiert. Dies liegt daran, dass es früher vorhersehbar war und die Entwickler der Go-Sprache nicht wollten, dass sich Menschen auf nicht spezifiziertes Verhalten verlassen. Deshalb haben sie es absichtlich randomisiert, sodass es unmöglich war, sich auf dieses Verhalten zu verlassen.
Was Sie dann tun müssen, ist, die Schlüssel in eine Scheibe zu ziehen, sie zu sortieren und dann wie folgt über die Scheibe zu strecken:
quelle
Alle Antworten hier enthalten jetzt das alte Verhalten von Karten. In Go 1.12+ können Sie einfach einen Kartenwert drucken und dieser wird automatisch nach Schlüssel sortiert. Dies wurde hinzugefügt, da es das Testen von Kartenwerten auf einfache Weise ermöglicht.
Lesen Sie hier mehr .
quelle
Wenn Sie wie ich feststellen, dass Sie im Wesentlichen denselben Sortiercode an mehr als einer Stelle wünschen oder nur die Codekomplexität gering halten möchten, können Sie die Sortierung selbst in eine separate Funktion abstrahieren, an die Sie die entsprechende Funktion übergeben die eigentliche Arbeit, die Sie möchten (die natürlich an jedem Anrufort unterschiedlich wäre).
Bei einer Karte mit Schlüsseltyp
K
und WerttypV
, dargestellt als<K>
und<V>
unten könnte die gemeinsame Sortierfunktion so etwas wie diese Vorlage Go-Code aussehen (die 1 Go - Version nicht als Service - Leistung nicht unterstützt):Rufen Sie es dann mit der Eingabekarte und einer Funktion (
(k <K>, v <V>)
als Eingabeargumente) auf, die über die Kartenelemente in sortierter Schlüsselreihenfolge aufgerufen wird.Eine Version des Codes in der Antwort von Mingu könnte also so aussehen:
Die
sortedMapIntString()
Funktion kann für jede wiederverwendet werdenmap[int]string
(vorausgesetzt, die gleiche Sortierreihenfolge ist erwünscht), wobei jede Verwendung auf nur zwei Codezeilen beschränkt bleibt.Nachteile sind:
Andere Sprachen haben verschiedene Lösungen:
<K>
und<V>
(um Typen für den Schlüssel und den Wert zu bezeichnen) ein wenig vertraut erscheint, unterscheidet sich diese Codevorlage nicht wesentlich von C ++ - Vorlagen.range
einen erstklassigen Typ so erstellt, dass er durch einen benutzerdefinierten Typ ersetzt werden kannordered-range
(anstelle desrange
ursprünglichen Codes), denke ich, dass einige andere Sprachen Iteratoren bereitstellen, die leistungsfähig genug sind, um dasselbe zu erreichen Ding.quelle
In ihrer Antwort auf James Craig Burley Antwort . Um ein sauberes und wiederverwendbares Design zu erstellen, könnte man sich für einen objektorientierteren Ansatz entscheiden. Auf diese Weise können Methoden sicher an die Typen der angegebenen Karte gebunden werden. Für mich fühlt sich dieser Ansatz sauberer und organisierter an.
Beispiel:
Erweitertes Spielplatzbeispiel mit mehreren Kartentypen.
Wichtige Notiz
In allen Fällen werden die Karte und das sortierte Segment ab dem Moment entkoppelt, an dem die
for
Schleife über die Karterange
beendet ist. Das heißt, wenn die Karte nach der Sortierlogik geändert wird, aber bevor Sie sie verwenden, können Probleme auftreten. (Nicht Thread / Go Routine sicher). Wenn sich der parallele Map-Schreibzugriff ändert, müssen Sie einen Mutex um die Schreibvorgänge und die sortiertefor
Schleife verwenden.quelle
Hier finden Sie das Codebeispiel zum Sortieren der Karte. Grundsätzlich bieten sie Folgendes:
und dies ist, was ich vorschlagen würde, stattdessen zu verwenden :
Den vollständigen Code finden Sie auf diesem Go-Spielplatz .
quelle