Учитывая две карты, как найти общие ключи между ними? - PullRequest
0 голосов
/ 03 июня 2018

У меня есть две структуры: Сотрудник и Проект.

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 (func (c *Company) getEmployeesOnSameProject(e *Employee) []*Employee { }) и зная, что сотрудник может принадлежать к нескольким проектам, мне трудно понять, как привлечь сотрудников к проектам.

e.Projects может быть что-то вроде -

eProjects {
  P1
  P2
} 

c.Projects может быть что-то вроде -

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

Если я E1, как я могу легко привлечь других сотрудников к тем же проектам (P1 и P2), что и я, не имея вложенного цикла for?

1 Ответ

0 голосов
/ 03 июня 2018

Если я правильно понимаю, в мире идей вы хотели бы иметь возможность поиска "сотрудников для данного проекта" , а также "проектов для данного сотрудника" ?

Не зная контекста, в котором вы будете использовать этот код;например, больше операций записи, чем чтения, больше операций чтения, чем записи, каковы требования к сложности пространства и времени.

Если вы стремитесь к O (1) поиску проектов для сотрудника и O (1) поиску сотрудниковдля проекта я бы предложил создать собственную структуру данных, чтобы облегчить это.Это самый маленький интерфейс, который будет работать:

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

Я не перечислил полную реализацию ниже, так как это было бы тривиально, но вы бы реализовали этот интерфейс со структурой, которая хранит 2 карты.,

Компромисс в том, что у вас больше затраты на запись / обновление и дублирование данных, преимущество - 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должно быть легко реализовано с помощью простого поиска по карте

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...