java - 如何在对象之间建立链接/关系?
问题描述
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的了解不够,但是一定有一种简单的方法可以在对象之间建立连接(比如本例中的父子关系),对吧?
解决方案
您可以添加一个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
推荐阅读
- django - 为什么 django post 方法在这种情况下不起作用?
- vba - 使用 Web Broswer Control 从 URL 缩放图像
- javascript - 当我从数据库中获取图像文件路径时,React Native 不显示图像
- angular - 如何在 Angular 11 中使用 signalR 协商 Azure 函数在令牌到期后获取访问令牌?
- r - 调整列表,以便从中提取元素导致均匀分布
- swift - 如何在 Swift 中的 tableview 之间显示单独的 View(box)
- java - 没有从 application.yaml 加载属性
- reactjs - 带去抖动输入的赛普拉斯测试
- google-kubernetes-engine - 实际数据加密密钥用于在 GKE 中加密 PV
- swiftui - SwiftUI:删除列表中的动画?