Существуют различные способы формулирования вашей функции, но все они совпадают с этими треками:
(⊂'bob'){(⍺⍳⍨⊣/⍵)⌷⊢/⍵}employee
Однако использование функции может быть слишком большой абстракцией, так как вы можете захотеть использовать индекс дляизвлечение из другой таблицы;
employee[employee[;1]⍳⊂'bob';2]
Для удобства чтения вы можете назвать ваши столбцы:
(name email)←⍳2
employee[employee[;name]⍳⊂'bob';email]
Но на самом деле классический способ - использовать отдельный массив для каждого столбца:
(name email)←↓⍉employee
email⌷⍨name⍳⊂'bob'
Для большей организации (избегая загрязнения рабочего пространства одним именем на столбец) вы можете собрать их в пространстве имен:
(Employee←⎕NS⍬).(name email)←↓⍉employee
Employee.(email⌷⍨name⍳⊂)'bob'
Если вы хотите добиться максимальной производительности базы данныхВы должны назначить каждому столбцу фиксированную ширину поля:
(name email)←10 30(⊢↑⍨⊢∘≢,⊣)¨↑¨↓⍉employee
email⌷⍨name⍳10↑'bob'
Конечно, вы можете поместить их в пространство имен, но вы также можете сохранить столбцы как элементы вектора. Это называется инвертированной таблицей .
employeeIT←10 30(⊢↑⍨⊢∘≢,⊣)¨↑¨↓⍉employee
(name email)←⍳2
(email⊃employeeIT)⌷⍨(names⊃employeeIT)⍳10↑'bob'
Еще один способ достижения высокой производительности - связать список имен с ⍳
, который заставляет APL генерировать хеш-таблицу. Фактически, вы можете также связать список адресов электронной почты с индексацией и использовать полностью функциональный подход:
(name email)←↓⍉employee
Name←name∘⍳
Email←⌷∘email
Email Name ⊂'bob'