gpt4 book ai didi

go - 给定两个映射,如何找到两者之间的公共(public)键?

转载 作者:数据小太阳 更新时间:2023-10-29 03:36:54 24 4
gpt4 key购买 nike

我有两个结构,Employee 和 Project。

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

type Project struct {
ID int
}

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

type Company struct {
Projects map[*Project]map[*Employee]struct{}
Employees map[*Employee]struct{}
}

给定 e *Employeec *Company (func (c *Company) getEmployeesOnSameProject(e *Employee) []*Employee { } ) 并且知道一个员工可以属于多个项目,我很难弄清楚如何让员工跨项目。

e.Projects 可能类似于 -

eProjects {
P1
P2
}

c.Projects 可能类似于 -

cProjects {
P1 {
E1
E2
}
P2 {
E1
E2
E3
E4
}
}

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

最佳答案

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

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

如果您的目标是 O(1) 查找员工的项目和 O(1) 查找员工的项目,那么我建议创建您自己的数据结构来促进这一点。这是可以工作的最小接口(interface):

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

我没有在下面列出完整的实现,因为计算起来很简单,但是您可以使用存储 2 个映射的结构来实现此接口(interface)。

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

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 方法应该很容易通过简单的 map 查找实现

关于go - 给定两个映射,如何找到两者之间的公共(public)键?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/50669176/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com