質問
私はJavaで家系図プログラムを作成しているか、少なくともしようとしています。私はいくつかのクラスを開発しました:
- 人 - 名前のジェンダー年齢などのゲッターとセッター
- FamilyMember-親と子供を設定するための人のゲッターとセッターを拡張する
- 家族 - 複数の家族と削除メンバーを追加する方法で構成されています
- 関係を設定するための主要なクラスであるFamilyTree。
私には2つの主な問題があります:
1)人々の間の関係を設定する必要があります。現在私はやっています:
FamilyMember A, FamilyMember B
B.setMother(A);
A.setChild(B);
上記の例は、母子関係を設定するためのものです。
これは非常に不格好なようです。すべての関係を実装するために非常に長く巻き込まれています。手続き的な方法で複数の関係を実装する方法に関するアイデアはありますか?
2)家系図を表示できる必要があります。これどうやってするの?生活を楽にするためのカスタムクラスはありますか?
御時間ありがとうございます...
解決
構造の描画に関しては、2世代以上が表示されている場合は、衝突(回線が交差する)を避けることは困難です。したがって、アプリケーションが2つに抑えることを許可している場合、それは素晴らしいことです。この種の表現を垂直に使用するプログラムをいくつか書きました。
または水平に:
一度により多くの世代が必要な場合は、他の表現を考え出す必要があります。同じレベルで同じ世代の全員に表示できるように、かなりまばらになり始める可能性があります。
関係をデータ構造として表現する方法に関して - まあ、それは乱雑です。最も簡単で、最もきれいなのは、それぞれ同じ個人の母親と父親である2人の個人が「結婚」していることです。しかし、複数のパートナー、継子などをどのように代表したいですか?あなたのプログラムが何をすべきかだけについてもっと知ることなく答えるのは難しいです。たぶんあなたのデータセットにはこれらの合併症がありません。しかし、もしそうなら、最初にトリッキーなケースを介して考える方が良いです - 単純な表現は、ハードケースをカバーするための簡単な拡張に役立つことはありません。
(手で)あなたが予想する最も難しいケースのいくつかを描きます。それは、どのような種類のデータを記録する必要があるか、それを整理する方法を示唆します。描くときに行う選択(最初に来る人、各ノードで使用するシンボルとテキストなど)は、データ構造の決定を通知します。
Bの母親とAの子供の両方を設定すると、冗長性があり、冗長性はエラーにつながります - 1つを選択します。どれ?さて、Bの母親(Aの性別)を設定すると、より多くの情報があり、0歳以上の子供に対して、個人が正確に2人の親を必要とすることがわかります。だから私は一緒に行く傾向があります ただ Bの母親を設定します。親が問題の個人に等しいセットを選択するために、すべてを反復することにより、常に個人の子供を見つけることができます。そして、実際に母親と父親の関係を保存すること(単純な親関係)を保存すると、重複が減少する可能性があります(個人と性別を保存していると仮定します)。
他のヒント
手続き的な方法で複数の関係を実装する方法に関するアイデアはありますか?
はい、あなたはそれ自体をオブジェクトとして表すことができます。 2人はゼロ以上の関係を持つことができます。
数年前、私は、その首謀者指数の2人の間の関連性のために、より一般的にこれを行った警察の記録システムに取り組みました。
関係が指示される場合があります。母---マザー - >子。
関係は階層的かもしれません。母親は親です。
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>();