Ci sono diversi modi per creare una struttura
dalla pianura La ricorsione è una delle migliori.
Questo
il programma lo usa, con una fase preliminare di figurazione
quali elementi sono i genitori.
Mentre la strategia è indipendente dalla lingua, ogni lingua
ha diversi dettagli delle strutture dati e
costruzioni. Ho reso l'approccio in Python.
NB, circa la metà di questo codice è a scopo di visualizzazione e dimostrazione, quindi puoi seguire e vedere come funziona l'algoritmo. Per la produzione, tassa gratuita per rimuovere quelle parti.
Oh ... e ho cambiato le etichette da "padre" a "nome" e "bambini" a "rapporti" perché l'ho trovato più gradevole. Puoi, ovviamente, scegliere quello che vuoi.
from pprint import pprint
from random import shuffle
from collections import defaultdict
import json
def show_val(title, val):
"""
Debugging print helpler.
"""
sep = '-' * len(title)
print "\n{0}\n{1}\n{2}\n".format(sep, title, sep)
pprint(val)
# ORIGINAL NAMES: emp_id, emp_name, mgr_id
# SIMPLIFIED NAMES: eid, name, mid
text = """
323,The Boss,
4444,Manager Joe,323
3,Manager Sally,323
4,Peon Frank,4444
33,Peon Dave,3
5,Peon Jill,4444
6,Peon Rodger,3
7,Peon Ralph,3
233,Clerk Jane,99
99,Supervisor Henri,3
"""
# parse text into lines
lines = [ l.strip() for l in text.strip().splitlines() ]
# construct list of people tuples
people = [ tuple(l.split(',')) for l in lines ]
# for demonstration and testing only, shuffle the results
shuffle(people)
show_val("randomized people", people)
# contstruct list of parents
parents = defaultdict(list)
for p in people:
parents[p[2]].append(p)
show_val("parents", parents)
def buildtree(t=None, parent_eid=''):
"""
Given a parents lookup structure, construct
a data hierarchy.
"""
parent = parents.get(parent_eid, None)
if parent is None:
return t
for eid, name, mid in parent:
report = { 'name': name }
if t is None:
t = report
else:
reports = t.setdefault('reports', [])
reports.append(report)
buildtree(report, eid)
return t
data = buildtree()
show_val("data", data)
show_val("JSON", json.dumps(data))
In esecuzione questo mostra il seguente output:
-----------------
randomized people
-----------------
[('233', 'Clerk Jane', '99'),
('4444', 'Manager Joe', '323'),
('33', 'Peon Dave', '3'),
('6', 'Peon Rodger', '3'),
('99', 'Supervisor Henri', '3'),
('3', 'Manager Sally', '323'),
('5', 'Peon Jill', '4444'),
('323', 'The Boss', ''),
('4', 'Peon Frank', '4444'),
('7', 'Peon Ralph', '3')]
-------
parents
-------
defaultdict(<type 'list'>, {'99': [('233', 'Clerk Jane', '99')], '323': [('4444', 'Manager Joe', '323'), ('3', 'Manager Sally', '323')], '3': [('33', 'Peon Dave', '3'), ('6', 'Peon Rodger', '3'), ('99', 'Supervisor Henri', '3'), ('7', 'Peon Ralph', '3')], '4444': [('5', 'Peon Jill', '4444'), ('4', 'Peon Frank', '4444')], '': [('323', 'The Boss', '')]})
----
data
----
{'name': 'The Boss',
'reports': [{'name': 'Manager Joe',
'reports': [{'name': 'Peon Jill'}, {'name': 'Peon Frank'}]},
{'name': 'Manager Sally',
'reports': [{'name': 'Peon Dave'},
{'name': 'Peon Rodger'},
{'name': 'Supervisor Henri',
'reports': [{'name': 'Clerk Jane'}]},
{'name': 'Peon Ralph'}]}]}
----
JSON
----
'{"name": "The Boss", "reports": [{"name": "Manager Joe", "reports": [{"name": "Peon Jill"}, {"name": "Peon Frank"}]}, {"name": "Manager Sally", "reports": [{"name": "Peon Dave"}, {"name": "Peon Rodger"}, {"name": "Supervisor Henri", "reports": [{"name": "Clerk Jane"}]}, {"name": "Peon Ralph"}]}]}'
Alcuni preliminari: usa anche print
per aiutare a mostrare i dati annidati
strutture. Normalmente riceviamo dati attraverso un database
connessione, qui solo la analizziamo dal testo statico.
Infine, mentre i dati che hai presentato sono meravigliosamente ordinati, con il
boss in alto e con i numeri di identificazione dei dipendenti più bassi (semplificando il)
problema, vorrei confermare che il codice funziona in qualsiasi ordine. Quindi ho modificato
alcuni dei numeri di identificazione per riflettere un'assegnazione non sequenziale e introdotti
random.shuffle
per randomizzare l'ordine dei dati. Non lo faresti in
produzione, ma come parte della sperimentazione, aumenta la fiducia della logica
lavorando in base alla progettazione, non a caso.