Benim gibi, birden fazla yerde aynı sıralama kodunu istediğinizi fark ederseniz veya sadece kod karmaşıklığını düşük tutmak istiyorsanız, sıralamanın kendisini ayrı bir işleve aktararak bunu yapan işlevi aktarabilirsiniz. istediğiniz fiili çalışma (tabii ki her arama sitesinde farklı olacaktır).
Anahtar türüne sahip bir harita Verilen K
ve değer türü V
olarak temsil, <K>
ve <V>
aşağıda bu git-kod şablonuna benzeyebilecek ortak sıralama fonksiyonu (olduğu gibi git sürüm 1 desteklemediği):
func sortedMap<K><T>(m map[<K>]<V>, f func(k <K>, v <V>)) {
var keys []<K>
for k, _ := range m {
keys = append(keys, k)
}
sort.Strings(keys) # or sort.Ints(keys), sort.Sort(...), etc., per <K>
for _, k := range keys {
v := m[k]
f(k, v)
}
}
Sonra onu girdi eşlemi ve (k <K>, v <V>)
eşleme elemanları üzerinden sıralı anahtar sırasına göre çağrılan bir işlev ( girdi argümanlarını alarak) ile çağırın .
Dolayısıyla, Mingu tarafından gönderilen cevaptaki kodun bir versiyonu şöyle görünebilir:
package main
import (
"fmt"
"sort"
)
func sortedMapIntString(m map[int]string, f func(k int, v string)) {
var keys []int
for k, _ := range m {
keys = append(keys, k)
}
sort.Ints(keys)
for _, k := range keys {
f(k, m[k])
}
}
func main() {
m := make(map[int]string)
m[1] = "a"
m[2] = "c"
m[0] = "b"
sortedMapIntString(m,
func(k int, v string) { fmt.Println("Key:", k, "Value:", v) })
}
sortedMapIntString()
Fonksiyonu, herhangi bir için kullanılan yeniden olabilir map[int]string
kod sadece iki satır, her kullanım tutulması, (aynı sıralama düzeni arzu edilir varsayılarak).
Olumsuz yönler şunları içerir:
- Fonksiyonları birinci sınıf olarak kullanmaya alışkın olmayan insanlar için okumak daha zor
- Daha yavaş olabilir (performans karşılaştırmaları yapmadım)
Diğer dillerin çeşitli çözümleri vardır:
- Kullanımı ise
<K>
ve <V>
(anahtar ve değer için göstermektedirler türlerine) biraz tanıdık geliyor, bu kod şablonu C ++ şablonları aksine korkunç değil.
- Clojure ve diğer diller, temel veri türleri olarak sıralı haritaları destekler.
- Go'nun
range
bir gelenekle ordered-range
( range
orijinal kod yerine) ikame edilebilecek birinci sınıf bir tür ürettiğini bilmesem de, diğer bazı dillerin aynı şeyi başarmak için yeterince güçlü yineleyiciler sağladığını düşünüyorum. şey.