鉴于两张地图,如何找到两者之间的公共密钥?

时间:2018-06-03 17:35:34

标签: go

我有两个结构,Employee和Project。

jsonrpc2.NewClient(conn.UnderlyingConn())

我有一个公司结构,其中包含以下内容:

type Employee struct {
    ID        int
    Projects map[*Departments]struct{}
}

type Project struct {
        ID        int
}

鉴于type Company struct { Projects map[*Project]map[*Employee]struct{} Employees map[*Employee]struct{} } e *Employeec *Company)并且知道员工可以属于多个项目,我很难确定如何让员工跨项目。< / p>

func (c *Company) getEmployeesOnSameProject(e *Employee) []*Employee { }可能类似于

e.Projects

eProjects { P1 P2 } 可能类似于

c.Projects

如果我是E1,如何在没有嵌套for循环的情况下轻松地让其他员工在同一个项目(P1和P2)上工作?

1 个答案:

答案 0 :(得分:0)

如果我理解正确,在想法世界中,您希望能够查找“给定项目的员工”以及“给定员工的项目”

不知道您将使用此代码的上下文;例如写入多于读取,读取多于写入,空间与时间复杂度要求是什么。

如果您的目标是O(1)查找员工的项目和O(1)查找项目的员工,那么我建议您创建自己的数据结构以便能够实现这一点。这是最小的界面:

type ProjectEmployees interface {
    RegisterProjectEmployee(p *Project, e *Employee)
    GetEmployees(p *Project) []*Employees
    GetProjects(e *Employee) []*Project
}

我没有列出下面的完整实现,因为它可以解决这个问题,但是你要用一个存储2个映射的结构来实现这个接口。

权衡是你有更大的写入/更新成本和数据重复,好处是双向Project <--> Employee的O(1)查找。

type projecEmployeesMap struct {
    pe map[*Project][]*Employee
    ep map[*Employee][]*Project
}

func (p *projectEmployeesMap) RegisterProjectEmployee(p *Project, e *Employee) {
    p.pe[p] = append(p.pe[p], e) // store the mapping project -> employees
    p.ep[e] = append(p.ep[e], p) // store the mapping employees --> project
}

使用简单的地图查找可以轻松实现get方法