【问题标题】:Logic for family tree program家谱程序的逻辑
【发布时间】:2011-05-30 22:00:47
【问题描述】:

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

  • Person - 名称的 getter 和 setter 性别年龄等
  • FamilyMember - 扩展 Person 吸气剂 和设置父母的二传手和 儿童
  • 系列 - 由多个 家庭成员及添加方法 移除成员
  • 作为主类的家谱 用于建立关系。

我有两个主要问题:

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

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

上面的例子是设置母子关系。

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

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

感谢您的宝贵时间...

【问题讨论】:

  • 你想怎么显示?

标签: java family-tree


【解决方案1】:

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

或水平:

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

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

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

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

【讨论】:

    【解决方案2】:

    关于如何实现多个的任何想法 程序较少的关系 怎么办?

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

    几年前,我研究了一个警察记录系统,该系统更普遍地用于在其主姓名索引中的任何两个人之间的关联。

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

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

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

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

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

    【讨论】:

      【解决方案3】:

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

      【讨论】:

      • 我想以树形结构显示它。我的主要问题是建立关系。我有一个家庭成员课程,允许一个人有母亲父亲和许多孩子。我不知道如何实现婚姻以及如何为同一个父母的许多孩子实现设置关系......感谢您的快速回复!
      猜你喜欢
      • 2023-03-24
      • 1970-01-01
      • 1970-01-01
      • 2022-12-16
      • 2015-11-10
      • 1970-01-01
      • 2013-04-12
      • 2016-03-17
      • 2016-11-06
      相关资源
      最近更新 更多