在java中创建系谱树

在java中创建系谱树,java,tree,Java,Tree,我的结构如下: Member { String firstName; String secondName; Member[] children; Member father; } 我必须用java实现这个树 我有一个成员的名字和第二个名字。我需要找到从根到那个节点的路。 有人能帮我吗 这就是我所拥有的: 公共班级成员{ public List<Member> children = new ArrayList<>(); public M

我的结构如下:

Member {
    String firstName;
    String secondName;
    Member[] children;
    Member father;
}
  • 我必须用java实现这个树
  • 我有一个成员的名字和第二个名字。我需要找到从根到那个节点的路。 有人能帮我吗
这就是我所拥有的:

公共班级成员{

public List<Member> children = new ArrayList<>();
public Member father = null;
public String secondName = null;
public String firstName = null;

public Member(String secondName, String firstName) {
    this.secondName = secondName;
    this.firstName = firstName;
}

public Member(String secondName, String firstName, Member father) {
    this.secondName = secondName;
    this.firstName = firstName;
    this.father = father;
}

public List<Member> getChildren() {
    return children;
}

public void setFather(Member father) {
    this.father = father;
    father.addChild(this);

}

public void addChild(String secondName, String firstName) {
    Member child = new Member(secondName, firstName);
    child.setFather(this);
    this.children.add(child);
}

public void addChild(Member child) {
    child.setFather(this);
    this.children.add(child);
}

public String getSecondName() {
    return this.secondName;
}

public String getFirstName() {
    return this.firstName;
}

public void setSecondName(String secondName) {
    this.secondName = secondName;
}

public void setPrenume(String firstName) {
    this.firstName = firstName;
}

public boolean isRoot() {
    return (this.father == null);
}

public void deleteFather() {
    this.father = null;
}
public List children=new ArrayList();
公共成员父=null;
公共字符串secondName=null;
公共字符串firstName=null;
公共成员(字符串secondName、字符串firstName){
this.secondName=secondName;
this.firstName=firstName;
}
公共成员(字符串secondName、字符串firstName、成员父){
this.secondName=secondName;
this.firstName=firstName;
这个。父亲=父亲;
}
公共列表getChildren(){
返回儿童;
}
公营父亲(成员父亲){
这个。父亲=父亲;
父亲,孩子(这个);
}
public void addChild(字符串secondName,字符串firstName){
成员子成员=新成员(第二名,第一名);
孩子。父亲(这个);
this.children.add(child);
}
公共无效添加子项(成员子项){
孩子。父亲(这个);
this.children.add(child);
}
公共字符串getSecondName(){
返回this.secondName;
}
公共字符串getFirstName(){
返回这个.firstName;
}
public void setSecondName(字符串secondName){
this.secondName=secondName;
}
public void setPrenume(字符串名){
this.firstName=firstName;
}
公共布尔值isRoot(){
返回(this.father==null);
}
公屋{
this.father=null;
}

}您的结构与我在应用程序中使用的ona类似。我通过创建泛型walker来解决这个问题,它从根开始遍历这三个,并使用visitor模式向我提供遍历结果

如果您将其转化为您的问题,它将如下所示:

public class SimpleWalker<T>{

    private Visitor<T> visitor;


    public SimpleWalker(Visitor<T> visitor) {
        this.visitor= visitor;
    }

    public void walk(Member node) {


        if (visitor.visit(node)) {
            for (Member  child : node.children) {
                walk(child);
            }
        }
        visitor.leave(node);

    }

    public T getResult() {
        return visitor.getResult();
    }

}
公共类SimpleWalker{
私人访客;
公共SimpleWalker(访客){
这个。访客=访客;
}
公共无效漫游(成员节点){
if(访客访问(节点)){
for(成员子级:node.children){
步行(儿童);
}
}
访客离开(节点);
}
公共T getResult(){
return visitor.getResult();
}
}
然后是访客界面

public interface Visitor<T> {
    boolean visit(Member   node);
    void leave(Member   node);
    T getResult();
}
公共界面访问者{
布尔访问(成员节点);
作废休假(会员节点);
T getResult();
}
而实现将是这样的

public class Pathfinder implements Visitor<List<Member>> {
        final private String firstname, secondname;//passed by constructor
        boolean found = false;
        List<Member> path = new ArrayList<>();

        public boolean visit(Member node) {
            if (node.firstname.equals(firstname)
                    && node.secondname.equals(secondname)) {
                found = true;
                return false;
            }
            return true;
        }

        public void leave(Member node) {
            if (found){
                path.add(0, node);
            }
        }

        public List<Member> getResult() {
            return path;
        }
    }
公共类Pathfinder实现访问者{
最后一个私有字符串firstname,secondname;//由构造函数传递
布尔值=false;
列表路径=新的ArrayList();
公共布尔访问(成员节点){
if(node.firstname.equals)(firstname)
&&node.secondname.equals(secondname)){
发现=真;
返回false;
}
返回true;
}
公共作废休假(成员节点){
如果(找到){
添加路径(0,节点);
}
}
公共列表getResult(){
返回路径;
}
}

此解决方案的优点是,无论您想在树中做什么,例如查找元素、计算某人的后代数量,您都可以使用walker,您需要做的就是创建新的访问者。

如果您想使用Java swing创建族谱,此Github项目可能会有所帮助:


它使用yFiles for Java库。

您可以使用深度优先搜索,我相信,这是一个视频。下面是一些树遍历的代码。这里有一篇wiki文章:如果你想在实现树方面获得帮助/指导,你可以派生
DefaultTreeModel
,为它提供
成员
类,从而实现
TreeNode
接口。谢谢你,我知道这不是很难,但我是java新手(@SMEău Dev事实上,他定义的已经是一棵树了。@DanilGaponov我知道,但OP似乎仍然“为树而错过森林”。^^^我如何创建新的访问者?@Gabriecomănescu如果你想实例化Pathfinder,你只需执行
Pathfinder visitor=新的Pathfinder(“joe”,“blobsky”)
请注意,您需要实现包含两个字符串参数的构造函数。如果您想创建新的自定义访问者,只需实现
visitor
接口即可