首页 > 解决方案 > 如何在对象之间建立链接/关系?

问题描述

public class MainClass {
    ArrayList<Man> mans = new ArrayList<Man>();
    // I'm filling in this arraylist, but I'm not writing those parts because I want to summarize the 
    //code. 
}

public class Man {
    int index_father, index_son;
    String name;
    public Man(String name){
        this.name = name;
    }
}

在这个男人群体中,有些人有父子关系。我的问题是:
我正在寻找一种更简洁的方式来建立这种父子关系。

我试图用整数建立这种关系(例如:which_father 显示了男人的父亲在'mans'列表中的目录)但这有一些缺点:
1-创建对象时,我总是必须在父亲之后创建儿子。因为:

private void createMan() {
    Man man = new Man("Ethan");
    man.index_father = 4;
    mans.add(man);
    mans.get(4).index_son = mans.indexOf(man);
}

如果我们还没有创造出父亲,那么人类的第四元素还没有被创造出来。
2- 如果我从 mans arraylist 中删除一个元素,which_fathers 将不会显示正确的父亲 man。

我可能对Java的了解不够,但是一定有一种简单的方法可以在对象之间建立连接(比如本例中的父子关系),对吧?

标签: java

解决方案


您可以添加一个List<Man>来代表Man班级中的儿子:

public class Man {
    String name;
    List<Man> sons = new ArrayList<>();
    
    public Man(String name){
        this.name = name;
    }
}

编辑:

我认为 OOP 可以帮助简化事情:

public class Person {
    Sex sex;
    String name;
    List<Person> children = new ArrayList<>();
    Person partner; // husband/wife

    public Person(String name, Sex sex){
        this.name = name;
        this.sex = sex;
    }
    
    public void marryTo(Person person){
        this.partner = person;
        person.setPartner(person);
    }

    public void setChildFromMarriage(Person child){
        children.add(child);
        partner.getChildren().add(child);
    }

    public enum Sex {
        MAN, WOMAN
    }
}

你可以保留一个List<Person>.

用法:

List<Person> people = Arrays.asList(
        new Person("Jordan", Person.Sex.MAN),
        new Person("Tim", Person.Sex.MAN),
        new Person("Sarah", Person.Sex.WOMAN)
);

// Let's marry Jordan to Sarah
Person jordan = getPersonByName(people, "Jordan");
Person sarah = getPersonByName(people, "Sarah");
jordan.marryTo(sarah);

Person child = new Person("Jordan Jr", Person.Sex.MAN);
// We can add the child to people list if we want
jordan.setChildFromMarriage(child);

// Let's change their child name using Sarah's reference. 
getPersonByName(sarah.getChildren(), "Jordan Jr").setName("Bob");

System.out.println(child.getName()); // Bob

private static Person getPersonByName(List<Person> people, String name) {
    return people.stream()
            .filter(person -> person.getName().equals(name))
            .findFirst()
            .get();
}

输出:

Bob

推荐阅读