家谱计划的逻辑

时间:2010-12-26 18:52:28

标签: java family-tree

我正在用Java创建一个家族树程序,或者至少尝试一下。我开发了几个类:

  • 人 - 名字的吸气剂和制定者 性别年龄等
  • FamilyMember - 扩展Person getters 和设置父母和 儿童
  • 家庭 - 由多个人组成 家庭成员和添加方法 删除成员
  • FamilyTree是主要类 用于建立关系。

我有两个主要问题:

1)我需要设置人与人之间的关系。目前我在做:

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

上面的例子是为了建立母子关系。

这看起来非常笨重。实现所有关系的时间越来越长。关于如何以较少程序的方式实现多个关系的任何想法?

2)我必须能够显示家谱。我怎样才能做到这一点?是否有任何自定义课程可以让生活更轻松?

感谢您的时间......

3 个答案:

答案 0 :(得分:4)

关于绘制结构,如果显示的代数超过2代,则很难避免碰撞(线条交叉)。因此,如果您的应用程序允许您将其保持为两个,那就太好了。我已经编写了许多使用这种表示的程序,可以是垂直的:

alt text

或横向:

alt text

如果您需要一次显示更多代,您需要提出其他表示形式,并且它们可能会开始变得非常稀疏,以便您可以在同一级别向同一代人显示每个人。

关于如何将关系表示为数据结构 - 好吧,它很混乱。最简单,最干净的事情是,任何两个分别是同一个人的母亲和父亲的人都“已婚”。但是,您想如何代表多个合作伙伴,继子女等?如果不了解您的计划应该做什么,那就很难回答。也许你的数据集没有这些复杂性。但是,如果确实如此,最好先考虑棘手的案例 - 简单的陈述不适合轻松扩展以覆盖困难案例。

(手工)绘制一些你预期的最难的案例;这将建议您需要记录哪种数据,以及如何组织它。您绘制时所做的选择(谁先来,每个节点使用什么符号和文本等)将为您的数据结构决策提供信息。

设置B的母亲和A的孩子似乎是多余的 - 冗余导致错误 - 选择一个。哪一个?那么,当你设置B的母亲(A的性别)时会有更多的信息,我们知道任何个人都需要两个父母,而不是0或更多的孩子。所以我倾向于选择 设置B的母亲;你总是可以通过遍历所有人来找出任何个体的孩子来挑选父母等于所讨论的个体的集合。并实际存储母亲和父亲关系(与简单的父母关系相比)可以减少重复(假设您与个人存储性别)。

答案 1 :(得分:1)

  

关于如何实现多重的任何想法   处理程度较低的关系   方式是什么?

是的,您可以将关系本身表示为对象。任何两个人都可以拥有零个或多个关系。

多年前,我在一个警察记录系统上工作,这个系统更广泛地用于其主人姓名索引中任意两个人之间的关联。

可以指导关系。母亲---是 - 母亲 - >儿童。

关系可能是分层的。母亲是父母。

  

2)我必须能够显示   家谱。我怎样才能做到这一点?是   那里有任何自定义类   让生活更轻松?

是的,现有代码支持图形显示。我个人在使用prefuse visualization toolkit时有很好的经验。

您可以找到感兴趣的预熔树视图;尝试点击this example中的节点。 (但是,如果您打算将软件供自己以外的家庭使用,则树可能不够用。)

答案 2 :(得分:0)

类似于下面的类(这是伪代码而不是真正的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>();