Frage

Ich erstelle ein Stammbaumprogramm in Java oder versuche es zumindest. Ich habe mehrere Klassen entwickelt:

  • Person - Getters und Setter für den Namen des Geschlechts usw.
  • Familymitglied - erweitert Personen Getters und Setter für die Festlegung von Eltern und Kindern
  • Familie - was aus mehreren Familienmitgliedern und Methoden zum Hinzufügen von Mitgliedern besteht
  • FamilyTree, die die Hauptklasse für die Aufstellung von Beziehungen ist.

Ich habe zwei Hauptprobleme:

1) Ich muss die Beziehungen zwischen Menschen aufstellen. Derzeit mache ich:

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

Das obige Beispiel dient zum Aufstellen einer Mutterkindbeziehung.

Das scheint sehr klobig. Es wird sehr lange gewickelt, um alle Beziehungen umzusetzen. Irgendwelche Ideen, wie mehrere Beziehungen weniger prozedural implementiert werden können?

2) Ich muss in der Lage sein, den Stammbaum anzuzeigen. Wie kann ich das machen? Gibt es benutzerdefinierte Klassen, die das Leben erleichtern?

Vielen Dank für Ihre Zeit...

War es hilfreich?

Lösung

In Bezug auf das Zeichnen der Struktur ist es schwierig, Kollisionen zu vermeiden (Linien, die kreuzen), wenn Sie mehr als 2 Generationen angezeigt haben. Wenn Ihre Bewerbung Sie also auf zwei Personen behalten kann, ist das großartig. Ich habe eine Reihe von Programmen geschrieben, die diese Art von Repräsentation verwenden, entweder vertikal:

alt text

oder horizontal:

alt text

Wenn Sie mehr Generationen gleichzeitig angezeigt werden, müssen Sie andere Darstellungen finden, und sie werden möglicherweise ziemlich spärlich, damit Sie alle in derselben Generation auf derselben Ebene zeigen können.

In Bezug auf die Darstellung der Beziehungen als Datenstrukturen - na ja, es ist chaotisch. Das einfachste, sauberste ist, dass zwei Personen, die jeweils Mutter und Vater derselben Person sind, "verheiratet" sind. Aber wie möchten Sie mehrere Partner, Stiefkinder und dergleichen darstellen? Das ist schwer zu beantworten, ohne mehr über das zu wissen, was Ihr Programm tun soll. Vielleicht hat Ihr Datensatz diese Komplikationen nicht. Wenn dies jedoch der Fall ist, ist es besser, zuerst die kniffligen Fälle durchzudenken - die einfachen Darstellungen eignen sich nicht für eine einfache Erweiterung, um die harten Fälle abzudecken.

Zeichnen Sie einige der schwierigsten Fälle, die Sie erwarten; Dies schlägt vor, welche Art von Daten Sie aufzeichnen müssen und wie Sie sie organisieren müssen. Die Entscheidungen, die Sie beim Zeichnen treffen (wer zuerst kommt, welche Symbole und der Text an jedem Knoten usw. verwendet werden), werden Ihre Datenstrukturentscheidungen beeinflussen.

Das Einstellen von Bs Mutter von B und A scheint überflüssig zu sein - und Redundanz führt zu Fehlern - wählen eine aus. Welcher? Nun, es gibt weitere Informationen, wenn Sie die Mutter von B (A's Geschlecht) festlegen und wir wissen, dass eine Person genau zwei Eltern benötigt, gegenüber einer Anzahl von Kindern mit 0 oder mehr Kindern. Also würde ich dazu neigen, mit zu gehen nur Mutters Mutter einstellen; Sie können immer die Kinder eines Einzelnen herausfinden, indem Sie alle über alles iterieren, um das Set auszuwählen, dessen Elternteil dem betreffenden Einzelnen entspricht. Und tatsächlich kann die Speicherung von Mutter und Vater -Beziehungen (gegenüber einfachen Elternbeziehungen) die Duplikation verringern (vorausgesetzt, Sie speichern das Geschlecht mit den Einzelpersonen).

Andere Tipps

Irgendwelche Ideen, wie mehrere Beziehungen weniger prozedural implementiert werden können?

Ja, Sie können die Beziehungen selbst als Objekte darstellen. Zwei Personen können null oder mehr Beziehungen haben.

Vor Jahren habe ich an einem Polizeiaufzeichnungssystem gearbeitet, das dies allgemeiner für Assoziationen zwischen zwei Personen im Master -Namensindex tat.

Beziehungen können gerichtet werden. Mutter --- IS-Mutter-> Kind.

Beziehungen können hierarchisch sein. Eine Mutter Isa Eltern.

2) Ich muss in der Lage sein, den Stammbaum anzuzeigen. Wie kann ich das machen? Gibt es benutzerdefinierte Klassen, die das Leben erleichtern?

Ja, es gibt vorhandenes Code, der die Anzeige von Grafiken unterstützt. Ich persönlich hatte gute Erfahrung mit der Arbeit mit dem Präfusions -Visualisierungs -Toolkit.

Möglicherweise finden Sie das Prefuse Treeview von Interesse. Versuchen Sie, auf die Knoten in zu klicken Dieses Beispiel. (Wenn Sie jedoch Ihre Software für andere Familien als Ihre eigenen verwenden, kann ein Baum nicht ausreichend sein.)

So etwas wie unten (dies ist ein Pseudocode, kein echter Java -Klasse)

class Node
{

     public Node Parent { get;set;}

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

}

Verwendet

     Node ultimateGrandParent = new Node();
     ultimateGrandParent.Parent = null;
     ultimateGrandParent.Childs = new List<Node>();
Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top