首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >家谱,无法解析下级

家谱,无法解析下级
EN

Stack Overflow用户
提问于 2018-12-06 22:37:51
回答 3查看 109关注 0票数 0

我对这项任务一无所知。我需要做这样的家谱

但是我不能在Main.java中解出孩子。对于每个名字,我必须将null写到孩子。

下面是我的代码:Main.java。第二个文件:Osoba.java

代码语言:javascript
复制
public class Main {

    public static void main(String[] args) {

        Osoba abraham = new Osoba("Abraham Simpson", null, null, null, null, null, null, null);
        Osoba penelope = new Osoba("Penelope Olsen", null, null, null, null, null, null,null);
        Osoba pan = new Osoba("Pan Bouvier", null, null, null, null, null,null,null);
        Osoba jackie = new Osoba("Jackie Bouvier", null, null, null, null, null,null,null);
        Osoba herb = new Osoba("Herb Powers", abraham, penelope, null, null, null,null,null);
        Osoba homer = new Osoba("Homer Simpson", abraham, penelope, null, null, null,null,null);
        Osoba marge = new Osoba("Marge Simpson", pan, jackie, null, null, null,null,null);
        Osoba selma = new Osoba ("Selma Bouvier", pan, jackie, null, null, null,null,null);
        Osoba bart = new Osoba("Bart Simpson", homer, abraham, penelope,marge, pan,jackie,null);

        bart.sestavRodokmen();
        System.out.println();
        homer.sestavRodokmen();
    }
}



public class Osoba {

    private String name;
    private Osoba father;
    private Osoba dad_grandpa;
    private Osoba dad_grandma;
    private Osoba mother;
    private Osoba mom_grandpa;
    private Osoba mom_grandma;
    private Osoba child;

    public Osoba (String name, Osoba father, Osoba dad_grandpa, Osoba dad_grandma, Osoba mother, Osoba mom_grandpa, Osoba mom_grandma, Osoba child) {
        this.name = name;
        this.father = father;
        this.dad_grandpa = dad_grandpa;
        this.dad_grandma = dad_grandma;
        this.mother = mother;
        this.mom_grandpa = mom_grandpa;
        this.mom_grandma = mom_grandma;
        this.child = child;
    }

    private String rodokmen;

    public void sestavRodokmen () {

        System.out.println("Rodokmen pro osobu: " + name);

        System.out.println("Name: " + name);
        System.out.println("Father: "+ father);
        System.out.println("Grandfather: "+ dad_grandpa);
        System.out.println("Grandmother: "+ dad_grandma);
        System.out.println("Mother: "+ mother);
        System.out.println("Grandfather: "+ mom_grandpa);
        System.out.println("Grandmother: "+ mom_grandma);
        System.out.println("Child: "+ child);

        rodokmen = "";
        System.out.println(rodokmen);
    }

    @Override
    public String toString () {
        String a = "";
        if(mother != null && father != null)
            a += name + "\n" + father + "\n" + mother +"\n" +"\n" + child;
        else
            a += name;

        return a;
    }
}
EN

回答 3

Stack Overflow用户

发布于 2018-12-06 23:01:04

在奥萨巴,只需要直接父母和/或直接子女。

在创建新的Osaba时,仍然不能定义父对象或子对象。

完全自由的创作顺序将是:

代码语言:javascript
复制
    Osoba abraham = new Osoba("Abraham Simpson");
    Osoba penelope = new Osoba("Penelope Olsen");
    Osoba pan = new Osoba("Pan Bouvier");
    Osoba jackie = new Osoba("Jackie Bouvier");
    Osoba herb = new Osoba("Herb Powers");
    Osoba homer = new Osoba("Homer Simpson");
    Osoba marge = new Osoba("Marge Simpson");
    Osoba selma = new Osoba ("Selma Bouvier");
    Osoba bart = new Osoba("Bart Simpson");

然后使用如下内容创建祖先图:

代码语言:javascript
复制
    herb.setParents(abraham, penelope);
    martha.setParents(null, penelope); // If no father.

现在,如果你想检查所有的Osaba:是否有人没有父母,有人不是他自己的祖先等等,也许你需要一个容器类:

代码语言:javascript
复制
public class Osabas {
    private List<Osaba> persons = new ArrayList<>();

    public Osaba createOsaba(String name) {
        Osaba osaba = new Osaba(name);
        persons.add(osaba);
        return osaba;
    }

    public void drawAncestryDiagram() {
        ...
    }
}

祝好运!

票数 2
EN

Stack Overflow用户

发布于 2018-12-06 23:00:35

  1. 我建议不要照顾grand-parents,因为你会发现他们的父母的父母

public Osoba (字符串名称,Osoba父亲,Osoba母亲,Osoba孩子){ this.name =名称;this.father =父亲;this.mother =母亲;this.child =孩子;}

  • toString()应该看起来更像Bart,只有名称,而不是完整的信息,否则你将面临递归,如果你像Bart一样打印,就会有整个家庭:

@Override公共字符串toString() { return String.join(“/ ",name,String != null?father.name : null,妈妈!= null?mother.name : null,子级!= null?child.name :空);}

  • 要在控制台中打印树,可以为每个新级别添加一个选项卡,依次打印人员及其父亲和母亲,因为您不知道家庭的大小,因此需要使用递归

void sestavRodokmen(int level) { System.out.println(toString());printParentTab(level,parent);printParentTab(level,level);} void printParentTab(int level,Osoba parent){ if (parent != null) { for (int i= 0;i <= level;i++) { System.out.print("\t");} parent.sestavRodokmen(level + 1);}}

巴特·辛普森/荷马·辛普森/玛吉·辛普森/ null荷马·辛普森/亚伯拉罕·辛普森/佩内洛普·奥尔森/ null亚伯拉罕·辛普森/ null / null / null佩内洛普·奥尔森/ null / null玛吉·辛普森/潘·布维耶/杰基·布维尔/ null潘·布维尔/ null / null / null Jackie Bouvier / null / null

票数 0
EN

Stack Overflow用户

发布于 2018-12-06 23:26:30

这就是我解决这个问题的方法:

首先,我们需要一个类来表示一个人。

您提供的图表似乎跟踪了4个属性:

  • name
  • surname
  • gender
  • linkage (父亲和母亲)

这反映在Person类中。

代码语言:javascript
复制
static class Person{
    private Person father;
    private Person mother;
    private List<Person> children = new ArrayList<>();
    private String firstname;
    private String surname;
    private boolean isMale;
    public Person(String firstname, String surname, boolean isMale){
        this.firstname = firstname;
        this.surname = surname;
        this.isMale = isMale;
    }
    public Person addChild(Person child){
        this.children.add(child);
        if(this.isMale){
            child.father = this;
        }else{
            child.mother = this;
        }
        return this;
    }

    public void printTreeUp(){
        printTreeUp(0);
    }
    private void printTreeUp(int depth){
        String tabs = "";
        if(depth != 0){
            tabs = "";
            for(int i=0;i<depth;i++)
                tabs += "\t";
            tabs += "∟ ";
        }
        System.out.println(tabs + firstname + " " + surname + " " + (isMale ? "♂" : "♀"));
        if(father != null)
            father.printTreeUp(depth+1);
        if(mother != null)
            mother.printTreeUp(depth+1);
    }
    public void printTreeDown(){
        printTreeDown(0);
    }
    private void printTreeDown(int depth){
        String tabs = "";
        if(depth != 0){
            tabs = "∟";
            for(int i=1;i<depth;i++)
                tabs += "_";
        }
        System.out.println(tabs + firstname + " " + surname + " " + (isMale ? "♂" : "♀"));
        for(Person child : children)
            child.printTreeDown(depth+1);
    }
}

如您所见,我还添加了一些方法来打印家谱树。特别地,有printTreeUp (从给定的Person开始)将打印他们的父母、祖父母等。还有printTreeDown (从给定的Person开始)将打印他们的孩子、孙子等。

main方法(构造示例家族树)如下所示:

代码语言:javascript
复制
public static void main (String[] args) throws java.lang.Exception
{
    Person gp0 = new Person("Abraham","Simpson", true);
    Person gp1 = new Person("Penelope","Olsen", false);

    Person gp2 = new Person("Pan","Bouvier", true);
    Person gp3 = new Person("Jackie","Bouvier", false);

    Person p0 = new Person("Herb","Powers", true);
    gp0.addChild(p0);
    gp1.addChild(p0);

    Person p1 = new Person("Homer","Simpson", true);
    gp0.addChild(p1);
    gp1.addChild(p1);

    Person p2 = new Person("Marge","Bouvier", false);
    gp2.addChild(p2);
    gp3.addChild(p2);

    Person p3 = new Person("Selma","Bouvier", true);
    gp2.addChild(p3);
    gp3.addChild(p3);

    Person c0 = new Person("Bart", "Simpson", true);
    p1.addChild(c0);
    p2.addChild(c0);

    // your code goes here
    c0.printTreeUp();
}

它输出Bart Simpson的族树(up),如下所示:

代码语言:javascript
复制
 Bart Simpson ♂  
    ∟ Homer Simpson ♂  
        ∟ Abraham Simpson ♂  
        ∟ Penelope Olsen ♀  
    ∟ Marge Bouvier ♀  
        ∟ Pan Bouvier ♂  
        ∟ Jackie Bouvier ♀
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/53653749

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档