6

我正在用 Java 创建一个家谱程序,或者至少尝试这样做。我开发了几个类:

  • 人 - 名称性别年龄等的获取者和设置者
  • FamilyMember - 扩展 Person 获取器和设置器以设置父母和孩子
  • Family - 由多个家庭成员和添加删除成员的方法组成
  • FamilyTree 是设置关系的主要类。

我有两个主要问题:

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

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

上面的示例用于设置母子关系。

这看起来很笨拙。实现所有关系变得非常冗长。关于如何以较少程序的方式实现多个关系的任何想法?

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

谢谢你的时间...

4

3 回答 3

4

关于绘制结构,如果显示超过 2 代,则很难避免冲突(线交叉)。因此,如果您的应用程序允许您将其减少到两个,那就太好了。我已经编写了许多使用这种表示的程序,或者是垂直的:

替代文字

或水平:

替代文字

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

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

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

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

于 2010-12-26T20:52:55.193 回答
1

关于如何以较少程序的方式实现多个关系的任何想法?

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

几年前,我在一个警察记录系统上工作,该系统更普遍地为它的主姓名索引中的任何两个人之间的关联做这件事。

关系可以被引导。母亲---是--->孩子的母亲。

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

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

是的,有支持图表显示的现有代码。我个人在使用prefuse 可视化工具包方面有很好的经验。

您可能会发现感兴趣的 prefuse 树视图;尝试单击此示例中的节点。(但是,如果您打算将您的软件供您自己以外的家庭使用,那么一棵树可能是不够的。)

于 2010-12-26T23:10:02.083 回答
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>();
于 2010-12-26T19:02:44.977 回答