doushifen4060 2016-01-13 07:52
浏览 28
已采纳

Golang:如何创建未知(动态)贴图长度

I can create a "static" map via

type m map[int]map[int]map[int]bool

but the length of "keys" will be dynamic:

 |---unknown len--|
m[1][2][3][4][2][0] = true

or

|---unk len--|
m[1][2][3][4] = true

How I can create this map in Go? Or any way exists?

Added: Hierarchical is IMPORTANT

Thanks in advance!

  • 写回答

4条回答 默认 最新

  • doucuo8618 2016-01-13 08:56
    关注

    Ok I had some fun playing with this a bit. Here is a much better implementation than what I did before:

    type mymap map[int]*myentry
    
    type myentry struct {
        m mymap
        b bool
    }
    
    func (mm mymap) get(idx ...int) *myentry {
        if len(idx) == 0 {
            return nil
        }
        entry, ok := mm[idx[0]]
        if !ok {
            return nil
        } else if len(idx) == 1 {
            return entry
        }
        for i := 1; i < len(idx); i++ {
            if entry == nil || entry.m == nil {
                return nil
            }
            entry = entry.m[idx[i]]
        }
        return entry
    }
    
    func (mm mymap) setbool(v bool, idx ...int) {
        if len(idx) == 0 {
            return
        }
        if mm[idx[0]] == nil {
            mm[idx[0]] = &myentry{m: make(mymap), b: false}
        } else if mm[idx[0]].m == nil {
            mm[idx[0]].m = make(mymap)
        }
        if len(idx) == 1 {
            mm[idx[0]].b = v
            return
        }
        entry := mm[idx[0]]
        for i := 1; i < len(idx); i++ {
            if entry.m == nil {
                entry.m = make(mymap)
                entry.m[idx[i]] = &myentry{m: make(mymap), b: false}
            } else if entry.m[idx[i]] == nil {
                entry.m[idx[i]] = &myentry{m: make(mymap), b: false}
            }
            entry = entry.m[idx[i]]
        }
        entry.b = v
    }
    
    func (m mymap) getbool(idx ...int) bool {
        if val := m.get(idx...); val != nil {
            return val.b
        }
        return false
    }
    
    func (m mymap) getmap(idx ...int) mymap {
        if val := m.get(idx...); val != nil {
            return val.m
        }
        return nil
    }
    

    Playground link

    Something like that ought to get you started

    本回答被题主选为最佳回答 , 对您是否有帮助呢?
    评论
查看更多回答(3条)

报告相同问题?

悬赏问题

  • ¥15 关于#windows#的问题:怎么用WIN 11系统的电脑 克隆WIN NT3.51-4.0系统的硬盘
  • ¥15 matlab有关常微分方程的问题求解决
  • ¥15 perl MISA分析p3_in脚本出错
  • ¥15 k8s部署jupyterlab,jupyterlab保存不了文件
  • ¥15 ubuntu虚拟机打包apk错误
  • ¥199 rust编程架构设计的方案 有偿
  • ¥15 回答4f系统的像差计算
  • ¥15 java如何提取出pdf里的文字?
  • ¥100 求三轴之间相互配合画圆以及直线的算法
  • ¥100 c语言,请帮蒟蒻写一个题的范例作参考