java更新列表中的所有子项

java更新列表中的所有子项,java,recursion,stream,Java,Recursion,Stream,假设我有一个相互关联的人的列表,每个人都有自己的家谱 public class Person { private int id; private String name; private List<Integer> ancestorIds; private int parentId; //getters and setters } 公共类人物{ 私有int-id; 私有字符串名称; 私有列表; 私有int-parentId; //接球手和接球手 } 假设我有如

假设我有一个相互关联的人的列表,每个人都有自己的家谱

public class Person {
  private int id;
  private String name;
  private List<Integer> ancestorIds;
  private int parentId;
  //getters and setters
}
公共类人物{
私有int-id;
私有字符串名称;
私有列表;
私有int-parentId;
//接球手和接球手
}
假设我有如下清单:

List<Person> persons = new ArrayList<Person>();
persons.add(new Person(3,"grandpa", {}, null));
persons.add(new Person(4,"pa", {3,4},3));
persons.add(new Person(5,"uncle", {3,5},3));
persons.add(new Person(7,"me", {3,4,7},4));
List persons=new ArrayList();
添加(新的人(3,“爷爷”{},空));
添加(新的人(4,“pa”{3,4},3));
添加(新的人(5,“叔叔”{3,5},3));
添加(新的人(7,“我”{3,4,7},4));
但是现在我们知道我爷爷和他的父亲实际上是一个身份证1。。我需要更新名单。。我如何做到这一点,记住我需要在线更新。。所以首先我的爷爷。。然后拿着他的安切斯托利德名单给我爸和叔叔(也加上他们的身份证)。然后我把我爸的名单加上我。我想我需要一些递归的方法


提前感谢

如果您对该数据结构进行更改,那么如果您让每个人只指向它的直系祖先,它将更加灵活。然后按需构建树。
你在问题中提到的方法,如果树没有改变,我会使用。

你是被迫使用这种表示法的吗?对于家谱而言,引用人员更为合理,尤其是将人员类别定义为:

公共类人物{
私有int-id;
私有字符串名称;
个人祖先名单;
私有int-parentId;
//接球手和接球手
}

如果这样做,你不需要更新任何东西,除了你的曾祖父。事实上,逐行操作并不是一个健壮的解决方案,因为存在错误的空间(如果您错过了一个ID),您应该避免这一点,以获得良好的设计。更糟糕的是,除非保留反向指针(即既有后代也有祖先),否则没有有效的方法来更新树下的祖先

你需要一个适合你的问题的合适的数据结构(例如)为什么你没有
列出祖先
个人父母
。我需要像我的例子中那样做