Java 家族谱的查询
问题描述
我们需要存储一个家族的族谱,并提供查询功能。族谱中的每个人都有姓名、性别、出生日期等基本信息,同时还有父亲和母亲两个属性,用于表示其父母的关系。我们需要实现以下功能:
- 添加一个人员的信息;
- 查询某个人的父亲和母亲信息;
- 查询某个人的孩子信息;
- 查询某个人的兄弟姐妹信息。
解决方案
我们可以使用面向对象的思想来解决这个问题。首先,我们可以定义一个 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)