DEV Community

Cover image for Golang: ทริค หาลำดับที่แน่นอนจาก Map
nathaponb
nathaponb

Posted on

Golang: ทริค หาลำดับที่แน่นอนจาก Map

#go

การวนลูป Map ในภาษา Go จะไม่การันตีเสมอไปว่า ลำดับ ของชุดข้อมูล ที่ถูกเข้าถึงในแต่ละรอบของการลูป จะเป็นไปตามลำดับที่เรากำหนด เพราะข้อมูลที่อยู่ใน Map จะเป็นการเก็บแบบ “ไม่มีลับดับที่แน่นนอน” (unordered)

จาก code snippet ด้านล่าง จะสังเกตได้ว่าในแต่ละรอบของ การวนลูป, ข้อมูลภายใน Map จะถูก print ออกมาสลับตำแหน่งกัน ทั้งๆที่เราได้กำหนดค่าให้ a,b และ c เป็นไปตามลำดับในเบื้องต้น

    func main() {
    kv := make(map[string]int)

    kv["a"] = 0
    kv["b"] = 1
    kv["c"] = 2

    for i := 0; i < 5; i++ {
      for k, v := range kv {
        fmt.Printf("key: %s --> value: %v\n", k, v)
      }
      fmt.Println("----------")
    }
  }
Enter fullscreen mode Exit fullscreen mode

หากต้องการเข้าถึงข้อมูลในลับดับที่แน่นอน จาก Map เราสามารถใช้ทริคง่ายๆ โดยการเก็บค่า key ไว้ใน slice และใช้ key อันนี้ในการเข้าถึง value จาก Map

  var keys []string

  for k,_ := range kv {
    keys = append(keys, k)
  }
Enter fullscreen mode Exit fullscreen mode

แต่อย่างที่กล่าวไป การวนลูป Map จะไม่การันตีลำดับชุดข้อมูลที่เข้าถึง ดังนั้นเราจึงต้อง sort ข้อมูลที่ได้มาตามลำดับที่ต้องการ

  sort.Strings(keys)
Enter fullscreen mode Exit fullscreen mode

และลองมาวนลูป Keys เพื่อเข้าถึงข้อมูลจาก Map กันอีกครั้ง

    for i := 0; i < 5; i++ {
    for _, key := range keys {
      fmt.Printf("key: %s --> value: %v\n", key, kv[key])
    }
    fmt.Println("----------")
  }
Enter fullscreen mode Exit fullscreen mode

ข้อมูลที่ได้จาก Map ก็จะมีลับดับที่แน่นอน.

Top comments (0)