题
我正在Java或至少尝试创建家谱程序。我已经开发了几个类:
- 人 - 名称性别年龄等的获取者和固定器
- Familymember-扩展人员和设定者以设定父母和孩子
- 家庭 - 由多个家庭成员和添加删除成员的方法组成
- Familytree是建立关系的主要班级。
我有两个主要问题:
1)我需要设置人之间的关系。目前我正在做:
FamilyMember A, FamilyMember B
B.setMother(A);
A.setChild(B);
上面的示例是建立母子关系。
这似乎很笨拙。实施所有关系已经持续了很长时间。关于如何以较少的程序方式实施多个关系的任何想法?
2)我必须能够展示家谱。我怎样才能做到这一点?有什么自定义课程可以使生活更轻松吗?
谢谢你的时间...
解决方案
关于绘制结构,如果您显示了超过2代,则很难避免碰撞(纵横交错)。因此,如果您的应用程序允许您将其降低到两个,那就太好了。我编写了许多使用这种表示形式的程序,要么垂直:
或水平:
如果您需要一次显示更多的世代,则需要提出其他表示形式,并且它们可能会开始变得很稀疏,以便您可以在同一级别上向同一一代中的每个人展示。
关于如何将关系表示为数据结构 - 好吧,这很混乱。最简单,最干净的是,同一个人的父母和父亲分别是“已婚”的任何两个人。但是,您要如何代表多个伴侣,继子女等?这很难回答,而无需更多地了解您的程序应该做什么。也许您的数据集没有这些并发症。但是,如果确实如此,最好先考虑一下棘手的案例 - 简单的表示并不能轻松扩展以覆盖硬案例。
(手工绘制)您预期的一些最困难的情况;这将暗示您需要录制哪种数据以及如何组织数据。您绘制时做出的选择(谁首先出现,每个节点上要使用的符号和文本等)将为您的数据结构决策提供信息。
设置B的母亲和A的孩子似乎多余 - 冗余导致错误 - 选择一个。哪一个?好吧,当您设置B的母亲(A的性别)时,还有更多信息,我们知道任何人都需要两个父母,而不是为0或少数的孩子。所以我倾向于 只是 设置B的母亲;您总是可以通过迭代所有人来挑选父母等于相关个人的场景来找出任何个人的孩子。实际上,存储母亲和父亲关系(与简单的父母关系)可能会减少重复(假设您正在与个人存储性别)。
其他提示
类似于下面的类(这是伪代码而不是真正的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>();