Jika, seperti saya, Anda merasa menginginkan kode pengurutan yang pada dasarnya sama di lebih dari satu tempat, atau hanya ingin menjaga kerumitan kode, Anda dapat memisahkan pengurutan itu sendiri ke fungsi terpisah, di mana Anda meneruskan fungsi yang melakukannya. pekerjaan aktual yang Anda inginkan (yang akan berbeda di setiap situs panggilan, tentu saja).
Diberikan peta dengan tipe kunci K
dan tipe nilai V
, yang direpresentasikan sebagai <K>
dan di <V>
bawah, fungsi sortir umum mungkin terlihat seperti template Go-code ini (yang Go versi 1 tidak mendukung apa adanya):
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)
}
}
Kemudian panggil dengan peta masukan dan fungsi (mengambil (k <K>, v <V>)
argumen masukannya) yang dipanggil di atas elemen peta dalam urutan tombol yang diurutkan.
Jadi, versi kode dalam jawaban yang diposting oleh Mingu mungkin terlihat seperti ini:
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) })
}
The sortedMapIntString()
fungsi dapat digunakan kembali untuk setiap map[int]string
(dengan asumsi urutan yang sama yang diinginkan), menjaga setiap penggunaan hanya dua baris kode.
Kerugiannya meliputi:
- Lebih sulit membaca untuk orang yang tidak terbiasa menggunakan fungsi sebagai kelas satu
- Mungkin lebih lambat (saya belum melakukan perbandingan kinerja)
Bahasa lain memiliki berbagai solusi:
- Jika penggunaan
<K>
dan <V>
(untuk menunjukkan tipe untuk kunci dan nilai) terlihat agak familiar, template kode tersebut tidak terlalu berbeda dengan template C ++.
- Clojure dan bahasa lain mendukung peta yang diurutkan sebagai tipe data fundamental.
- Meskipun saya tidak tahu cara apa pun Go membuat
range
tipe kelas satu sehingga dapat diganti dengan custom ordered-range
(sebagai pengganti range
dalam kode asli), saya pikir beberapa bahasa lain menyediakan iterator yang cukup kuat untuk mencapai hal yang sama. benda.