Программа для семейного дерева - PullRequest
6 голосов
/ 26 декабря 2010

Я создаю программу на семейном древе на Java или, по крайней мере, пытаюсь.Я разработал несколько классов:

  • Человек - получатели и установщик для имени половой возраст и т. Д.
  • FamilyMember - расширяет средства получения и установки Человека для установки родителей и детей
  • Семья- который состоит из нескольких членов семьи и методов добавления удаляемых членов
  • FamilyTree, который является основным классом для установки отношений.

У меня есть две основные проблемы:

1) Мне нужно установить отношения между людьми.В настоящее время я делаю:

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

Приведенный выше пример предназначен для установления отношений между матерью и ребенком.

Это кажется очень неуклюжим.Становится очень долго, чтобы реализовать все отношения.Любые идеи о том, как реализовать несколько отношений менее процедурным способом?

2) Я должен быть в состоянии отобразить семейное древо.Как я могу это сделать?Существуют ли какие-либо специальные классы, облегчающие жизнь?

Спасибо, что уделили время ...

Ответы [ 3 ]

4 голосов
/ 26 декабря 2010

Что касается рисования структуры, трудно избежать столкновений (перекрещивание линий), если у вас отображается более 2 поколений. Так что, если ваше приложение позволяет вам сократить его до двух, это здорово. Я написал несколько программ, которые используют этот вид представления, либо по вертикали:

alt text

или по горизонтали:

alt text

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

Относительно того, как представлять отношения как структуры данных - ну, это грязно. Самая простая и чистая вещь состоит в том, что любые два человека, которые являются соответственно матерью и отцом одного и того же человека, «женаты». Но как вы хотите представлять нескольких партнеров, приемных детей и тому подобное? Трудно ответить, не зная больше о том, что ваша программа должна делать. Может быть, ваш набор данных не имеет этих осложнений. Если это произойдет, то лучше сначала продумать сложные случаи - простые представления не поддаются легкому расширению для охвата сложных случаев.

Нарисуйте (от руки) несколько самых сложных случаев, которые вы ожидаете; это подскажет, какие данные вам нужно записать и как их организовать. Выбор, который вы делаете при рисовании (кто идет первым, какие символы и текст использовать на каждом узле и т. Д.), Будет определять ваши решения относительно структуры данных.

Установка матери B и ребенка A кажется избыточной - а избыточность приводит к ошибкам - выберите одну. Который из? Ну, есть больше информации, когда вы устанавливаете мать B (пол A), и мы знаем, что любому человеку понадобятся ровно два родителя, а не 0 или более детей. Так что я бы предпочел, чтобы просто установил мать Б; вы всегда можете узнать детей любого человека, перебирая все, чтобы выбрать набор, родитель которого равен данному человеку. А на самом деле хранение отношений между матерью и отцом (по сравнению с простыми отношениями с родителями) может уменьшить дублирование (при условии, что вы сохраняете пол с людьми).

1 голос
/ 27 декабря 2010

Любые идеи о том, как реализовать несколько отношений менее процедурным способом?

Да, вы можете сами представлять отношения как объекты.Любые два человека могут иметь ноль или более отношений.

Несколько лет назад я работал над системой полицейских записей, которая делала это в более общем плане для ассоциаций между любыми двумя людьми в его индексе имени мастера.

Отношения могут быть направлены.Мать --- мать -> Ребенок.

Отношения могут быть иерархическими.Мать - это родитель.

2) Я должен иметь возможность отображать семейное древо.Как я могу это сделать?Существуют ли какие-либо пользовательские классы, облегчающие жизнь?

Да, существует код, поддерживающий отображение графиков.Лично у меня был хороший опыт работы с инструментарием визуализации prefuse .

Вы можете найти интересующее дерево предузлования;попробуйте щелкнуть узлы в в этом примере .(Однако, если вы собираетесь использовать свое программное обеспечение для семей, отличных от ваших, дерева может быть недостаточно.)

0 голосов
/ 26 декабря 2010

что-то вроде ниже класса (это псевдокод, а не настоящий класс Java)

class Node
{

     public Node Parent { get;set;}

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

}

использует

     Node ultimateGrandParent = new Node();
     ultimateGrandParent.Parent = null;
     ultimateGrandParent.Childs = new List<Node>();
...