Java 家族谱的查询

问题描述

我们需要存储一个家族的族谱,并提供查询功能。族谱中的每个人都有姓名、性别、出生日期等基本信息,同时还有父亲和母亲两个属性,用于表示其父母的关系。我们需要实现以下功能:

  1. 添加一个人员的信息;
  2. 查询某个人的父亲和母亲信息;
  3. 查询某个人的孩子信息;
  4. 查询某个人的兄弟姐妹信息。

解决方案

我们可以使用面向对象的思想来解决这个问题。首先,我们可以定义一个 Person 类来表示一个人的信息,包括姓名、性别、出生日期等属性。然后,我们可以在 Person 类中定义父亲和母亲两个属性,用于表示其父母的关系。同时,我们还可以定义一个 FamilyTree 类来存储所有人员的信息,并提供查询功能。

Person 类

我们可以定义一个 Person 类来表示一个人的信息。每个 Person 对象都有姓名、性别、出生日期等基本信息,并且有父亲和母亲两个属性来表示其父母的关系。以下是 Person 类的代码示例:

public class Person {
    private String name;
    private String gender;
    private String birthDate;
    private Person father;
    private Person mother;
    
    public Person(String name, String gender, String birthDate) {
        this.name = name;
        this.gender = gender;
        this.birthDate = birthDate;
    }
    
    public String getName() {
        return name;
    }
    
    public String getGender() {
        return gender;
    }
    
    public String getBirthDate() {
        return birthDate;
    }
    
    public void setFather(Person father) {
        this.father = father;
    }
    
    public void setMother(Person mother) {
        this.mother = mother;
    }
    
    public Person getFather() {
        return father;
    }
    
    public Person getMother() {
        return mother;
    }
}

FamilyTree 类

我们可以定义一个 FamilyTree 类来存储所有人员的信息,并提供查询功能。FamilyTree 类可以包含一个 Map 对象来保存所有人员的信息,其中键为人员的姓名,值为对应的 Person 对象。以下是 FamilyTree 类的代码示例:

import java.util.HashMap;
import java.util.List;
import java.util.Map;
import java.util.stream.Collectors;

public class FamilyTree {
    private Map<String, Person> personMap;
    
    public FamilyTree() {
        personMap = new HashMap<>();
    }
    
    public void addPerson(Person person) {
        personMap.put(person.getName(), person);
    }
    
    public Person getPersonByName(String name) {
        return personMap.get(name);
    }
    
    public List<Person> getChildren(Person person) {
        return personMap.values().stream()
                .filter(p -> p.getFather() == person || p.getMother() == person)
                .collect(Collectors.toList());
    }
    
    public List<Person> getSiblings(Person person) {
        return personMap.values().stream()
                .filter(p -> p.getFather() == person.getFather() && p != person)
                .collect(Collectors.toList());
    }
}

以上代码中,我们使用了一个 Map 对象 personMap 来保存所有人员的信息。addPerson 方法用于添加一个人员的信息,getPersonByName 方法用于根据姓名查询一个人的信息。getChildren 方法用于查询某个人的孩子信息,这里使用了 Java 8 的流式操作和过滤器来实现。getSiblings 方法用于查询某个人的兄弟姐妹信息,也使用了流式操作和过滤器来实现。

类图

下面是 Person 类和 FamilyTree 类的类图:

classDiagram
    class Person {
        -String name
        -String gender
        -String birthDate
        -Person father
        -Person mother
        +Person(String name, String gender, String birthDate)
        +String getName()
        +String getGender()
        +String getBirthDate()
        +void setFather(Person father)
        +void setMother(Person mother)
        +Person getFather()
        +Person getMother()
    }
    
    class FamilyTree {
        -Map<String, Person> personMap
        +FamilyTree()
        +void addPerson(Person person)
        +Person getPersonByName(String name)