Логика для программы семейного древа
-
13-10-2019 - |
Вопрос
Я создаю программу семейного дерева в Java или, по крайней мере, пытаюсь. Я разработал несколько классов:
- Человек - Getters и Setter для имени гендерного возраста и т. Д.
- Член семьи - продлевает и сеттеры, чтобы установить родителей и детей
- Семья - которая состоит из нескольких членов семьи и методов для добавления удаления членов
- FamilyTree, который является основным классом для установления отношений.
У меня две основные проблемы:
1) Мне нужно установить отношения между людьми. В настоящее время я делаю:
FamilyMember A, FamilyMember B
B.setMother(A);
A.setChild(B);
Приведенный выше пример для установления отношений с мать -ребенком.
Это кажется очень неуклюжим. Он становится очень длинным, чтобы внедрить все отношения. Есть идеи о том, как внедрить несколько отношений менее процедурным образом?
2) Я должен иметь возможность показать семейное древо. Как я могу это сделать? Есть ли какие -нибудь пользовательские занятия, чтобы облегчить жизнь?
Спасибо за ваше время...
Решение
Что касается рисования структуры, трудно избежать столкновений (пересечение линий), если у вас отобразилось более 2 поколений. Поэтому, если ваше приложение позволяет вам оставить его до двух, это здорово. Я написал ряд программ, которые используют этот вид представления, любой по вертикали:
или горизонтально:
Если вам нужно больше поколений, отображаемых одновременно, вам нужно придумать другие представления, и они могут начать становиться довольно скудными, чтобы вы могли показать всем в одном поколении на одном и том же уровне.
Что касается того, как представлять отношения как структуры данных - ну, это грязно. Самая простая и чистая вещь - это то, что любые два человека, которые являются соответственно мать и отец того же человека, «женаты». Но как вы хотите представлять нескольких партнеров, ущерб и тому подобное? На это трудно ответить, не зная больше о том, что должна делать ваша программа. Может быть, ваш набор данных не имеет этих осложнений. Если это так, то лучше сначала продумать сложные случаи - простые представления не поддаются легкому расширению, чтобы покрыть сложные случаи.
Нарисуйте (вручную) несколько самых сложных случаев, которые вы ожидаете; Это предполагает, какие данные вам нужны для записи и как их организовать. Выбор, который вы делаете при рисовании (кто на первом месте, какие символы и текст используют в каждом узле и т. Д.), Будет сообщать ваши решения по структуре данных.
Установка матери Б. и ребенок А кажется избыточным - и избыточность приводит к ошибкам - выберите один. Который из? Что ж, есть больше информации, когда вы устанавливаете мать B (пол), и мы знаем, что любому человеку понадобятся ровно два родителя, по сравнению с количеством детей 0-или более. Так что я бы склонен идти с просто установить мать Б; Вы всегда можете узнать детей любого человека, итерация по всему всем, чтобы выбрать набор, чей родитель равен рассматриваемому человеку. И на самом деле хранение отношений матери и отца (в отличие от отношения между родителями) может уменьшить дублирование (при условии, что вы храните пол с людьми).
Другие советы
Есть идеи о том, как внедрить несколько отношений менее процедурным образом?
Да, вы можете представлять отношения сами как объекты. Любые два человека могут иметь ноль или более отношений.
Несколько лет назад я работал над системой полицейских записей, которая делала это в более общем плане для ассоциаций между любыми двумя людьми в своем индексе главного имени.
Отношения могут быть направлены. Мать --- Материал-> Ребенок.
Отношения могут быть иерархическими. Мать Иса родитель.
2) Я должен иметь возможность показать семейное древо. Как я могу это сделать? Есть ли какие -нибудь пользовательские занятия, чтобы облегчить жизнь?
Да, существующий код, который поддерживает отображение графиков. Лично у меня был хороший опыт работы с Предварительная визуализация инструментария.
Вы можете найти предварительное дерево интереса; Попробуйте нажать на узлы в этот пример. Анкет (Однако, если вы намереваете свое программное обеспечение для использования семьями, кроме вашего собственного, дерево может быть недостаточным.)
что -то вроде класса ниже (это псевдод, а не настоящий класс 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>();