我已经通过StackOverflow搜索了我自己"并没有运气。我认为我在toString()
方法中遇到了无限递归的问题,但我不确定,因为我对此很新。
我认为首先提供给我的代码会让问题更加清晰:
import java.util.ArrayList;
public class User{
private String name;
private ArrayList<User> friends;
private static ArrayList<User> users = new ArrayList<User>();
public User(String name){
this.name = name;
this.friends = new ArrayList<User>();
users.add(this);
}
public void addFriend(User friend){
friends.add(friend);
}
public static void connect(User user1, User user2){
user1.addFriend(user2);
user2.addFriend(user1);
}
public static ArrayList<User> getUsers(){
return users;
}
public String toString(){
return String.format("%s : %s", name, friends);
}
}
我不确定你是否能看到我想要做的事情,但我toString
的格式应该是这样的:
姓名:{friend1,friend2,friend3,...}
例如,与朋友“Bob”和“Charlie”的用户“Alice”会像这样打印
爱丽丝:{Bob,Charlie,}我不太确定我应该如何继续实现这一目标。任何帮助将非常感激。如果之前已经回答过,我也很抱歉,但我不理解我之前找到的任何答案。
这是我的main
方法,可能也会有所帮助:
public class Main{
public static void main(String args[]){
User bob = new User("Bob");
User alice = new User("Alice");
User charlie = new User("Charlie");
User.connect(alice, bob);
User.connect(alice, charlie);
System.out.println(User.getUsers());
}
}
答案 0 :(得分:3)
你需要遍历&#34;朋友&#34;列出并打印每个名称。因为您要打印每个朋友,包括朋友&#39;朋友,这就是你获得无限递归的原因。
尝试类似
的内容public String toString() {
int count = 0;
StringBuilder sb = new StringBuilder("{\"name\"=" + name + ", \"friends\"=[");
for (User friend : friends) {
sb.append(friend.getName());
if (++count < friends.size()) sb.append(", ");
}
sb.append("]}");
return sb.toString();
}
答案 1 :(得分:2)
我怀疑问题在于,当您致电Alice.toString()
并开始迭代爱丽丝的朋友列表时,它会调用每位朋友的toString()
。
如果Alice
是Bob
的朋友,而Bob
也是Alice
的朋友,那么您最终会在Alice.toString()
和Bob.toString()
之间来回蹦蹦跳跳{1}}无限期。
答案 2 :(得分:1)
从我的观点来看,问题可能是,一旦你调用toString,试图显示所有用户,发生的事情是在toString方法中你连续调用用户的朋友的toString。
为了避免递归,尝试迭代用户的朋友列表,并用用户的朋友的信息连接空字符串,而不是再次声明朋友的朋友。总而言之,避免递归:)