我目前正在研究一个问题,我必须通过Java中的递归找到友谊链。从统计数据来看,一个人在大约6个航点上认识另一个人 - 这是我想要找到的链条。
我有一个“人”类,它定义了一个名字和直接的朋友:
public class Person
{
private Person[] friendChain;
private String name;
public Person(String name, Person[] friendChain)
{
this.friendChain = friendChain;
this.name = name;
}
public Person[] getFriends()
{
return this.friendChain;
}
public String getName()
{
return this.name;
}
public boolean isFriendWith(Person person)
{
for(Person p: this.friendChain)
{
if(p != null && person != null && p.getName().equals(person.getName()))
return true;
}
return false;
}
public boolean equals (Person person)
{
return this.name.equals(person.getName());
}
public String toString()
{
return this.getName();
}
}
给出了一个示例链,其中箭头表示单向或双向关系(如Thomas知道Theresa,但Theresa不知道Thomas):
所以基本上我的结果看起来应该像这样:
result = getFriendshipChain(adam, theresa);
result[0].getName(); // "Michael"
result[1].getName(); // "Kerstin"
result[2].getName(); // "Thomas"
result[3].getName(); // "Theresa"
result[4].getName(); // null
result[5].getName(); // null
我过去做了很多递归编程,但我现在无法理解这一点 - 我很感激任何帮助!
答案 0 :(得分:1)
以下是一个示例,但要小心,只有当您的图表只有一个类似于示例图片的路径时才能使用
如果这不足以满足您的需求,至少第一步和第二步(也许是第三步)也应该有所帮助:
1)您只接受00A0
的构造函数中的friendsChain
,但是如何传递尚未创建的Person
个对象链?
这是循环创建依赖;我建议使用较轻的构造函数以及Person
的setter删除问题。
friendChain
2)让我们构建public Person(final String name) {
this.name = name;
}
public void setFriendChain(final Person[] friendChain) {
this.friendChain = friendChain;
}
个对象并填充他们的朋友链
Person
3)让我们构建一个跟随朋友链的递归方法(注意我们使用Person adam = new Person("Adam");
Person michael = new Person("Michael");
Person kerstin = new Person("Kerstin");
Person thomas = new Person("Thomas");
Person theresa = new Person("Theresa");
Person[] adamsFriends = { michael, kerstin };
adam.setFriendChain(adamsFriends);
Person[] michaelsFriends = { adam, kerstin };
michael.setFriendChain(michaelsFriends);
Person[] kerstinsFriends = { thomas, adam, michael };
kerstin.setFriendChain(kerstinsFriends);
Person[] thomasFriends = { kerstin, theresa };
thomas.setFriendChain(thomasFriends);
Person[] theresasFriends = { thomas };
theresa.setFriendChain(theresasFriends);
,因为我们不知道链的最终大小):
List
4)称之为:
public void getFriendshipChain(final Person from, final Person to, final List<Person> friendshipChain) {
friendshipChain.add(from);
// We have found the target person, return
if (from.equals(to)) {
return;
}
// For every friend from that person
for (Person friend : from.getFriendChain()) {
// If we don't already have it in the list
if (!friendshipChain.contains(friend)) {
// follow this friend's chain
getFriendshipChain(friend, to, friendshipChain);
}
}
}