我有两个结构,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 *Employee
(c *Company
)并且知道员工可以属于多个项目,我很难确定如何让员工跨项目。< / p>
func (c *Company) getEmployeesOnSameProject(e *Employee) []*Employee { }
可能类似于
e.Projects
eProjects {
P1
P2
}
可能类似于
c.Projects
如果我是E1,如何在没有嵌套for循环的情况下轻松地让其他员工在同一个项目(P1和P2)上工作?
答案 0 :(得分:0)
如果我理解正确,在想法世界中,您希望能够查找“给定项目的员工”以及“给定员工的项目”/ EM>
不知道您将使用此代码的上下文;例如写入多于读取,读取多于写入,空间与时间复杂度要求是什么。
如果您的目标是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方法