Domanda

Io sono la creazione di un programma di albero genealogico in Java, o almeno cercare di. Ho sviluppato diverse classi:

  • persona - getter e setter per il nome età genere etc
  • familymember - estende getter Person e setter per l'impostazione genitori e bambini
  • Famiglia - che si compone di più familiari e metodi per aggiungere rimozione di membri
  • FamilyTree che è la classe principale per impostare le relazioni.

Ho due problemi principali:

1) Ho bisogno di impostare i rapporti tra le persone. Attualmente sto facendo:

FamilyMember A, FamilyMember B
B.setMother(A);
A.setChild(B);

L'esempio precedente è per impostare una relazione madre bambino.

Questo sembra molto goffo. Si sta facendo molto lungo senza fiato per implementare tutte le relazioni. Tutte le idee su come implementare più relazioni in modo meno procedurale?

2) devo essere in grado di visualizzare l'albero genealogico. Come posso fare questo? Ci sono classi personalizzate là fuori per rendere la vita più facile?

Grazie per il vostro tempo ...

È stato utile?

Soluzione

Per quanto riguarda il disegno della struttura, è difficile collisioni evitare (linee che attraversano) se si dispone di più di 2 generazioni visualizzati. Quindi, se la vostra applicazione vi permette di tenere giù a due, che è grande. Ho scritto un certo numero di programmi che utilizzano questo tipo di rappresentazione, sia in verticale:

alt text

o in orizzontale:

alt text

Se avete bisogno di più generazioni visualizzati in una sola volta, è necessario venire con altre rappresentazioni, e si può iniziare a ottenere abbastanza radi solo così che si può mostrare tutti nella stessa generazione allo stesso livello.

Per quanto riguarda il modo di rappresentare le relazioni come strutture di dati - beh, è ??disordinato. Il più semplice, cosa più pulita è che due individui che sono, rispettivamente, la madre e il padre dello stesso individuo sono "sposati". Ma come vuoi rappresentare più partner, step-bambini e simili? Questo è difficile rispondere senza sapere di più su solo ciò che si suppone il vostro programma di fare. Forse il vostro set di dati non ha queste complicazioni. Se lo fa, però, è meglio pensare attraverso i casi difficili primi -. Le rappresentazioni semplici non si prestano ad una facile estensione per coprire i casi difficili

Draw (a mano) alcuni dei casi più difficili che anticipare; che vi suggerisce il tipo di dati è necessario per registrare, e come organizzarlo. Le scelte che si fanno mentre si disegna (che viene prima, quali simboli e testo per l'uso in ogni nodo, etc.) informerà le vostre decisioni di struttura dati.

Impostazione madre sia di B e del bambino di A sembra ridondante - e ridondanza porta a errori - sceglierne uno. Quale? Beh, non c'è più informazioni quando si imposta la madre di B (genere di A) e sappiamo ogni individuo avrà bisogno di esattamente due genitori, rispetto a un 0-o-più il numero di figli. Quindi vorrei tendono ad andare con solo Impostazione madre di B; si può sempre trovare i bambini di qualsiasi individuo mediante iterazione su tutti di scegliere il set di cui padre è uguale alla persona in questione. E in realtà la memorizzazione di Mother & Father relazioni (rispetto a semplici relazioni padre) può ridurre la duplicazione (supponendo che si sta memorizzando genere con le persone).

Altri suggerimenti

Tutte le idee su come implementare multipla relazioni in una meno procedurale modo?

Sì, è possibile rappresentare le stesse relazioni come oggetti. Due persone possono avere zero o più rapporti.

Anni fa ho lavorato su un sistema di dati della polizia che ha fatto questo più in generale per le associazioni tra due persone nel suo indice nome padrone.

I rapporti possono essere indirizzate. Madre --- è-madre-di -> Bambino.

I rapporti possono essere gerarchica. Un genitore madre isa.

2) devo essere in grado di visualizzare il albero genealogico. Come posso fare questo? Siamo Ci sono delle classi personalizzate là fuori per Rendere la vita più facile?

Sì, c'è il codice esistente che supporta la visualizzazione di grafici. Personalmente ho avuto una buona esperienza di lavoro con la Prefuse visualizzazione toolkit .

Si può trovare la vista ad albero Prefuse di interesse; prova a cliccare sui nodi in questo esempio . (Tuttavia, se si intende il software per l'utilizzo da parte delle famiglie diverse dalla propria, un albero può essere insufficiente.)

qualcosa di simile al di sotto della classe (questa è una pseudo codice non una vera e propria classe Java)

class Node
{

     public Node Parent { get;set;}

     public List<Node> Childs {get;set;}

}

usi

     Node ultimateGrandParent = new Node();
     ultimateGrandParent.Parent = null;
     ultimateGrandParent.Childs = new List<Node>();
Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top