2016-04-13 17 views
0

map[string]intがあるとし、最短の長さ(バイト単位)のキーが必要です。私はマップが含まれている任意の特定の要素がわからない場合は、どのように私はそれのサンプルを入手できますので、私はあなたがforループを使用して、ただ一つの要素をサンプリングするために、すぐにそれを打破することができますGoでマップの任意の要素を取得するにはどうすればよいですか?

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

おそらく私は質問を理解していません。あなたが提供したコードサンプルがなぜ機能しないのですか? –

+0

@ william.taylor.09それは最短であることを意味します。 – EMBLEM

答えて

2

を行うことができます。

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

醜いですが、うまくいきます。

+0

なぜこれがダウン表示されますか?どうして?私が見つけた有用な小さなトリックは、他の答えよりも効率的です。 – EMBLEM

+0

申し訳ありません、EMBLEM。私はOPが短絡を求めていたので、私はdownvotedしていた、あなたは最長を提供した。 OPは彼が短絡したかったとコメントし、私は最短の答えを出しました。その間、短絡を反映するために回答を編集しました。しかし、質問を再編集しない限り、私は投票を変更できません。答えに素早く編集していただければ嬉しいです。不平を言うのをやめる。 –

+0

@ william.taylor.09私はOPです。私は自分の疑問に答えました。 – EMBLEM

0

マップを反復して要素をスライスに追加することができます。スライスを並べ替えるその後:

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

あなたが最初の二つの変数shortestLengthshortestを定義する必要があり、彼らはそれぞれ、あなたが今まで見つかった最短の長さを記録し、対応するキーになります。そして地図上で反復を開始します。

ここでは、最初のパスで上書きされる値でshortestLength変数を初期化する方法があります。利点は、余分なコードを書いたり、キーをソートして最短のものを見つけるために余分なメモリを割り当てる必要がないことです。

完全なコードは、次の通りである:

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 
    } 
} 

変数shortestLengthが上書き我々のforループの最初の反復の最初の要素の長さを有するであろう。ループの最後には、最短キーの長さが含まれます。 shortestには鍵自体が含まれます。

関連する問題