数据结构如下:
public class Person{
private String id;
private String gender;
private String fatherId;
private String motherId;
}
需求:公母的动物繁殖,需要加一个校验,公和母的三代的族谱不能有交集,所说的三代包含的数据范围如下图,就是以图中的自己为基点,怎么把图中包含的数据都查出来?
import java.util.*;
class Person {
private String id;
private String gender;
private String fatherId;
private String motherId;
private List<Person> children;
public Person(String id, String gender, String fatherId, String motherId) {
this.id = id;
this.gender = gender;
this.fatherId = fatherId;
this.motherId = motherId;
this.children = new ArrayList<>();
}
public String getId() {
return id;
}
public String getGender() {
return gender;
}
public String getFatherId() {
return fatherId;
}
public String getMotherId() {
return motherId;
}
public List<Person> getChildren() {
return children;
}
public void addChild(Person child) {
children.add(child);
}
}
class Family {
private List<Person> members;
public Family() {
this.members = new ArrayList<>();
}
public void addMember(Person member) {
members.add(member);
}
public List<Person> getMembers() {
return members;
}
}
public class ThreeGenerations {
public static List<Person> findThreeGenerations(Person target, Family family) {
Set<String> visited = new HashSet<>();
List<Person> result = new ArrayList<>();
visited.add(target.getId());
dfs(target, visited, result, 0, family);
return result;
}
private static void dfs(Person person, Set<String> visited, List<Person> result, int generation, Family family) {
if (generation == 3) {
result.add(person);
return;
}
for (Person child : person.getChildren()) {
if (visited.contains(child.getId())) {
return;
}
visited.add(child.getId());
dfs(child, visited, result, generation + 1, family);
}
}
}
3代族谱,指的是祖先中3代不能有交集,肯定不包括子女
所以往上追溯3代即可
至于其他旁支里面是不是有近亲繁殖的,跟你想要比较的一对没有一毛钱关系,根本就不用管
把所有递归到的数据塞进一个list里,查重
package 适配器模式;
//1.继承(类适配器,单继承)
//2.组合(对象适配器:常用)
public class Adapter extends Adaptee implements NetToUsb {
//真正的适配器, 需要连接到源程序的网线和电脑的usb
@Override
public void handleRequest() {
super.Request();
}
}
我可以给出一个Java递归查询祖先信息的示例代码,该代码基于一个Animal类的族谱数据结构。假设每个Animal类实例都有一个parents属性,它是一个双元素的Animal数组,存储该实例的父母信息。这是示例代码:
public class Animal {
private String name;
private int generation;
private Animal[] parents;
// 构造函数,省略getter和setter
public Animal(String name, int generation, Animal[] parents) {
this.name = name;
this.generation = generation;
this.parents = parents;
}
// 递归函数,输出该Animal实例的三代祖先信息
public void printAncestors(int level) {
for (int i = 0; i < level; i++) {
System.out.print("\t"); // 打印tab缩进,控制输出格式
}
System.out.println(name + " (" + generation + ")");
if (parents != null && parents.length == 2) {
parents[0].printAncestors(level + 1);
parents[1].printAncestors(level + 1);
}
}
}
// 示例用法
// 构造族谱数据结构
Animal g01 = new Animal("爷爷1", 1, null);
Animal g02 = new Animal("爷爷2", 1, null);
Animal g03 = new Animal("奶奶1", 1, null);
Animal g04 = new Animal("奶奶2", 1, null);
Animal f01 = new Animal("爸爸1", 2, new Animal[]{g01, g03});
Animal f02 = new Animal("爸爸2", 2, new Animal[]{g02, g04});
Animal m01 = new Animal("妈妈1", 2, null);
Animal m02 = new Animal("妈妈2", 2, null);
Animal p01 = new Animal("自己", 3, new Animal[]{f01, m01});
// 递归输出该Animal实例的三代祖先信息
p01.printAncestors(0);
该示例代码通过递归方式遍历了该Animal实例的祖先链表,并输出了它们的信息。您可以根据需要修改该示例代码来查询符合您的数据结构和业务需求的族谱信息。