2016-04-13 8 views
0

Angenommen, ich habe eine map[string]int, und ich möchte den Schlüssel mit der kürzesten Länge (in Bytes). Wenn ich weiß, kein besonderes Element, dass die Karte enthält, wie bekomme ich eine Probe davon so kann ichWie bekomme ich ein beliebiges Element einer Karte in Go?

var shortest string 
for key, _ := range myMap { 
    if len(key) < len(shortest) { 
     shortest = key 
    } 
} 
+0

Vielleicht verstehe ich die Frage nicht; Warum würde das von Ihnen bereitgestellte Code-Beispiel nicht funktionieren? –

+0

@ william.taylor.09 Es war der kürzeste. – EMBLEM

Antwort

2

Sie eine for Schleife verwenden können und brechen aus ihm sofort nur ein Element zur Probe .

var shortest string 
for key, _ := range myMap { 
    shortest = key 
    break 
} 
for key, _ := range myMap { 
    if len(key) < len(shortest) { 
     shortest = key 
    } 
} 

Hässlich, aber es funktioniert.

+0

Warum wird dies abgelehnt? Warum? Es ist ein nützlicher kleiner Trick, den ich gefunden habe, der effizienter ist als die andere Antwort. – EMBLEM

+0

Entschuldigung, EMBLEM. Ich hatte abgelehnt, seit OP nach dem Kurzschluss gefragt hatte, und Sie haben den längsten bereitgestellt. OP meinte dann, er wolle den Kurzschluss, und ich gab eine Antwort für den kürzesten. In der Zwischenzeit haben Sie Ihre Antwort bearbeitet, um die Kurzschlüsse zu berücksichtigen. Allerdings wird es mir nicht möglich sein, meine Stimme zu ändern, wenn Sie die Frage nicht erneut bearbeiten. Ich würde Sie gerne auf den neuesten Stand bringen, wenn Sie die Antwort kurz bearbeiten, also S.O. hört auf sich zu beschweren. –

+0

@ william.taylor.09 Ich bin der OP. Ich hatte meine eigene Frage beantwortet. – EMBLEM

0

Sie können über die Karte iterieren und die Elemente zu einem Segment hinzufügen. Dann sortieren Sie die Scheibe:

var keys []string 
for k := range myMap { 
    keys = append(keys, k) 
} 
sort.Strings(keys) // keys[0] is the shorted 

GoPlay: http://play.golang.org/p/DULIiQAkfg

1

Sie sollten zunächst zwei Variablen definieren shortestLength und shortest, werden sie kürzeste Länge aufzeichnen Sie bis jetzt gefunden, und Schlüssel entsprechen. Und dann fange an, über die Karte zu iterieren.

Hier besteht der Trick darin, shortestLength Variable mit einem Wert zu initialisieren, der im ersten Durchgang überschrieben wird. Der Vorteil ist, dass Sie keinen zusätzlichen Code schreiben müssen und zusätzlichen Speicher zuweisen müssen, um die Schlüssel zu sortieren und den kürzesten zu finden.

komplette Code ist wie folgt:

if len(myMap) == 0 { 
    // Empty map 
} 

// Will be over-written in first iteration 
shortestLength := maths.MaxInt32 
shortest := "" 

for key, _ := range myMap { 
    keyLength := len(key) 
    if keyLength <= shortestLength { 
    shortest = key 
    shortestLength = keyLength 
    } 
} 

Die Variable shortestLength wird mit der Länge des ersten Elements in der ersten Iteration der for-Schleife über geschrieben werden. Und am Ende der Schleife wird die Länge des kürzesten Schlüssels enthalten. Und shortest wird den Schlüssel selbst enthalten.

Verwandte Themen