Art Go-map-Werte mit den Tasten
Beim Durchlaufen der zurückgegebene Karte in den code zurückgegeben, die das Thema Funktion, die Tasten erscheinen nicht in Ordnung.
Wie bekomme ich die keys werden in der Reihenfolge /Sortierung der anzeigen, so dass die Tasten sind in Ordnung und die Werte entsprechen?
Hier ist der code.
- Mögliche Duplikate von Wie zum Durchlaufen einer Karte in golang in Ordnung ist?
Du musst angemeldet sein, um einen Kommentar abzugeben.
Den Gehen blog: Go maps in Aktion hat eine hervorragende Erklärung.
Hier ist meine modifizierte version von Beispiel-code:
http://play.golang.org/p/dvqcGPYy3-
Ausgabe:
keys := make([]int, len(m))
und dann einfügen von indexkeys[i] = k
stattappend
Entsprechend der Gehen spec, die Reihenfolge der iteration über eine Karte ist nicht definiert und kann variieren zwischen den Läufen des Programms. In der Praxis ist es nicht nur nicht definiert, ist es tatsächlich absichtlich variiert. Dies ist, weil es vorhersehbar zu sein, und die Gehen Sprache Entwickler nicht wollen, dass die Menschen sich auf unbestimmte Verhalten, so dass Sie absichtlich randomisierte es so, dass auf dieses Verhalten verlassen, war unmöglich.
Was Sie tun müssen, ist ziehen Sie die Schlüssel in eine Scheibe, Sie zu Sortieren, und dann über die Scheibe wie diese:
Alle Antworten hier enthalten jetzt das alte Verhalten der Karten. In Gehen 1.12+, Sie können einfach drucken Sie eine Karte Wert und es wird sortiert nach Schlüssel automatisch. Dies wurde Hinzugefügt, weil es ermöglicht die Prüfung von map-Werte leicht.
Lesen Sie mehr hier.
Wenn, wie mir, Sie finden, Sie möchten im wesentlichen die gleichen Sortier-code an mehr als einem Ort, oder wollen einfach nur halten Sie die code-Komplexität nach unten, können Sie abstrahieren die Sortierung selbst um eine separate Funktion, auf die Sie übergeben der Funktion, die die tatsächliche Arbeit, die Sie wollen (das wäre an jedem anderen Anruf Website, natürlich).
Gegeben eine Karte mit den wichtigsten Typ
K
und Wert TypV
, dargestellt als<K>
und<V>
unten, die gemeinsame Funktion Sortieren könnte wie folgt Aussehen Gehen-der code-Vorlage (die version 1 nicht unterstützt ist):Dann rufen Sie es mit der input-Karte und eine Funktion (unter
(k <K>, v <V>)
als seine input-Argumente), die aufgerufen wird, über die map-Elemente sind in sortiert-key bestellen.So, eine version des Codes in der Antwort geschrieben von Mingu Aussehen könnte:
Den
sortedMapIntString()
- Funktion kann wieder verwendet werden für jedenmap[int]string
(vorausgesetzt, die gleiche Sortierreihenfolge gewünscht ist), halten jeder nur zwei Zeilen code.Nachteile sind:
Andere Sprachen haben verschiedene Lösungen:
<K>
und<V>
(zu bezeichnen Arten, die für die Schlüssel-und Wert -) sieht ein bisschen vertraut, dass der code-Vorlage ist nicht sehr anders als in C++ templates.range
ein erste-Klasse-Typ, so dass es könnte ersetzt werden durch eine benutzerdefinierteordered-range
(stattrange
im original-code), ich glaube, einige andere Sprachen sind Iteratoren, die mächtig genug sind, um das gleiche erreichen.In der Antwort auf James Craig Burley ist Antwort. Um eine saubere und wiederverwendbare design, könnte man Sie für eine mehr Objekt-orientierten Ansatz. Auf diese Weise Methoden sicher sein kann, gebunden an den Typen, der die angegebene Karte. Für mich ist dieser Ansatz fühlt sich sauberer und organisiert.
Beispiel:
Erweiterte Spielplatz Beispiel mit mehrere Karten-Typen.
Wichtiger Hinweis
In allen Fällen, die Karte und die sortierten Scheibe entkoppelt sind von dem moment an, die
for
Schleife über die Karterange
fertig ist. Was bedeutet, dass, wenn die Karte wird geändert, nachdem die Sortier-Logik, aber bevor Sie es verwenden, können Sie in Schwierigkeiten geraten. (Nicht thread /Go-routine sicher). Wenn es zu einer änderung von parallel-Karte schreiben zugreifen, werden Sie brauchen, um eine mutex um die schreib-und die sortiertfor
Schleife.